1002μ κ²½μ° TDD λ‘ DB λΆλΆμ λ§λ€λ μ΄λ»κ² μ§νλ κΉ κΆλ¦¬νλμ€ λκ°μ§λ₯Ό μ€νν΄λ³΄μλ€. 보ν΅μ TDDλ‘ DB λΆλΆμ λ§λ€λ DB Repository λΆλΆμ λν΄μ MockObject λ₯Ό λ§λ€μ§λ§, λ€μμ Mock μ μλ§λ€κ³ μμ±ν΄λ΄€λ€. μ΄λ€ μΌμ΄ μΌμ΄λ κΉλ₯Ό μκ°νλ©°.
~cpp
import junit.framework.TestCase;
import java.sql.*;
public class SpikeRepositoryTest extends TestCase {
private Connection con;
protected IRepository repository;
private String writer;
private String title;
private String body;
public void setUp() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
initConnection();
repository= new SpikeRepository(con);
repository.initialize();
writer = "writer";
title = "title";
body = "body";
}
public void tearDown() throws SQLException {
repository.destroy();
uninitConnection();
}
public void testEdit() throws SQLException {
repository.createArticle(writer, title, body);
String writerEdited = "writerEdited";
String titleEdited = "titleEdited";
String bodyEdited = "bodyEdited";
repository.edit(1, writerEdited, titleEdited, bodyEdited);
Article article = repository.get(1);
assertEquals (writerEdited, article.getWriter());
assertEquals (titleEdited, article.getTitle());
assertEquals (bodyEdited, article.getBody());
}
public void testTotalArticle() throws SQLException {
repository.createArticle(writer, title, body);
assertEquals (1, repository.getTotalArticle());
}
public void testCreateArticle() throws SQLException {
repository.createArticle(writer, title, body);
assertEquals (1, repository.getTotalArticle());
}
public void testDelete() throws SQLException {
repository.createArticle(writer, title, body);
repository.delete(1);
assertEquals (0, repository.getTotalArticle());
}
public void testGet() throws SQLException {
repository.createArticle(writer, title, body);
Article article2 = repository.get(1);
assertEquals(writer, article2.getWriter());
}
public void testArticleTableInitialize() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
repository = new SpikeRepository(con);
repository.initialize();
String articleTableName = "articlelist";
String sqlStr="select id, writer, title, body from " + articleTableName;
PreparedStatement pstmt= con.prepareStatement(sqlStr);
ResultSet rs = pstmt.executeQuery();
assertEquals (0, rs.getRow());
}
private void initConnection() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
String hostname = "localhost";
String dbname = "reset";
String userId = "reset";
String userPass = "reset";
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url="jdbc:mysql://"+hostname+"/"+dbname+"?user="+userId+"&password="+userPass;
con = DriverManager.getConnection(url);
}
private void uninitConnection() throws SQLException {
con.close();
}
public void testDuplicatedInitialize() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
repository.initialize();
repository.initialize();
repository.initialize();
repository.destroy();
}
}
μμ±νλμ€μ, DBμ μ§μ μ μν΄μ νμΈνλ μ½λκ° ν
μ€νΈμ λλ¬λ¬λ€. (μ΄λ μμν μΌμ΄κΈ΄ νλ€. DB μ λΉμ’
μμ μΈ interface λ₯Ό μ μΈνλλΌλ DB μͺ½ μ½λλ₯Ό κ³μ μμκ°κΈ° μν΄μ DB μ½λλ₯Ό μ΄λμ λ μ¨μΌ νλ€.) μ²μ DB μ μ§μ λ°μ΄ν°λ₯Ό λ£μλλ side-effectκ° λ°μνλ―λ‘, ν
μ€νΈλ₯Ό 2λ²μ© λλ €μ€μ side-effectλ₯Ό νμΈμ νλ€. μ μ°¨μ μΌλ‘ initialize λ©μλμ destroy λ©μλλ₯Ό λ§λ€κ³ μ΄λ₯Ό setUp, tearDown μͺ½μ λ£μ΄μ€μΌλ‘ ν
μ€νΈμμ side-effectλ₯Ό ν΄κ²°ν΄λκ°λ€.
νλ‘κ·Έλλ°μ νλ€κ°, λ§μΌ μ¬κΈ°μλΆν° interface λ₯Ό μΆμΆνλ€μ κ±°κΎΈλ‘ MockRepository λ₯Ό λ§λ€ μ μμκΉ νλ μκ°μ νλ€. (interface λ₯Ό μΆμΆν¨μΌλ‘μ κ°μ λ©μλμ λν΄ λ€λ₯Έ μ±κ²©μ Repository, μ¦ File Based λ λ€λ₯Έ μλ² λ‘λΆν° λ°μ΄ν°λ₯Ό μ»μ΄μ€λ Repository λ± λ€νμ±μ μκ°ν΄λ³Ό μ μλ κ²μ΄λ€.)
κ²°κ³Όλ λ€μμ λ¬Έμ κ° λ°μνμλ€. λ°λ‘, interface μ DB Exception λμ§κ²λ€μ΄ 묻μ΄λλκ²μ΄λ€.
κ²°κ³Όλ λ€μμ λ¬Έμ κ° λ°μνμλ€. λ°λ‘, interface μ DB Exception λμ§κ²λ€μ΄ 묻μ΄λλκ²μ΄λ€.
~cpp
import java.sql.SQLException;
public interface IRepository {
Article get(int index) throws SQLException;
void initialize() throws SQLException;
void destroy() throws SQLException;
void edit(int index, String writer, String title, String body) throws SQLException;
int getTotalArticle() throws SQLException;
void createArticle(String writer, String title, String body) throws SQLException;
void delete(int index);
}
μ¦, MockRepository μμλ Exception μ λμ§ νμκ° μλλ°, λ©μλλ§λ€ μ λΆ throw λ₯Ό λμ Έμ€μΌ νλ€. (ννΈμΌλ‘λ, λ€λ₯Έ μΈμ΄μμλ μκ΄μλλ° Java μμμ Checked Exception μ λ¬Έμ μΌλ°μ§λ λͺ¨λ₯΄κ² λ€.λ§μΌ MockRepositoryλ₯Ό λ¨Όμ λ§λ λ€λ©΄? interface λ₯Ό μΆμΆν μκ°μλ λ¬Έμ κ° μκ² μ§λ§, λ€μμ DBRepository λ₯Ό λ§λ€λκ° λ¬Έμ κ° λλ€. interface μ μ μμμλ μμΈλ₯Ό λμ§μ§ μμΌλ―λ‘, interface λ₯Ό λ€μ μμ νλμ§, μλλ©΄ SQL κ΄λ ¨ Exception μ μ λΆ ν΄λΉ λ©μλ μμμ try-catch λ‘ μ‘μλ΄μΌ νλ€. μ¦, Database μμμ μμΈμ²λ¦¬λ€μ λν΄ μ λΆ Repository μμμ μ체ν΄κ²°μ νκ²λ κ°μνλ μ½λκ° λμ¨λ€.
μ΄λ€ κ²μ΄ μ¬λ°λ₯Έ μΌμΌκΉ. --1002









