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