'Mockito'에 해당되는 글 1

  1. 2010.06.05 Mockito 를 이용한 테스트

Mockito 를 이용한 테스트

https://javacan.tistory.com/entry/MocktestUsingMockito
https://bestalign.github.io/2016/07/08/intro-mockito-1/

- http://code.google.com/p/mockito/

- 단위 테스트에서 외부 자원을 대체하기 에서 사용한 코드를 Mockito를 이용해서 만들어 본다.

- Mockito를 적용
public class DatabaseExampleTest {
    @Test
    public void testReadAbc() throws SQLException {
       
        MockResultSet rs = new MockResultSet();
        rs.addRow(new Object[]{101, "John"});
       
        //MockStatement st = new MockStatement();
        //st.setResultSet(rs);
        Statement st = mock(Statement.class);
        stub(st.executeQuery("SELECT empno, empid FROM TestTable")).toReturn(rs);
       
        //MockConnection con = new MockConnection();
        //con.setStatement(st);
        Connection con = mock(Connection.class);
        stub(con.createStatement()).toReturn(st);
       
        DatabaseExample example = new DatabaseExample();
        assertEquals("1:101,John\n", example.readAbc(con, "TestTable"));
    }
}

- 11번째 라인은 다음과 같이 간단하게 변경할 수 있다.
stub(st.executeQuery("SELECT ... FROM TestTable")).toReturn(rs);
stub(st.executeQuery(anyString())).toReturn(rs);
stub(st.executeQuery(startsWith("SELECT"))).toReturn(rs);
org.mockito.Matchers에 any*() 등 다양한 메서드가 있다.

- 어노테이션을 사용할 수 있다.
@RunWith(MockitoJUnitRunner.class)
public class DatabaseExampleTest {

    @Mock private Connection con;
    @Mock private Statement st;
    private MockResultSet rs;
    DatabaseExample example;
   
    @Before
    public void setUp() throws Exception {
        rs = new MockResultSet();
       
        st = mock(Statement.class);
        stub(st.executeQuery(anyString())).toReturn(rs);
       
        con = mock(Connection.class);
        stub(con.createStatement()).toReturn(st);
       
        example = new DatabaseExample();
    }
   
    @Test
    public void testReadAbc() throws SQLException{       
        rs.addRow(new Object[]{101, "John"});
        assertEquals("1:101,John\n", example.readAbc(con, "TestTable"));
    }

    @Test
    public void testReadAbcWithMultiRow() throws SQLException{       
        rs.addRow(new Object[]{101, "John"});
        rs.addRow(new Object[]{102, "Jane"});
        assertEquals("1:101,John\n2:102,Jane\n", example.readAbc(con, "TestTable"));
    }
}

- 비지니스 로직이 있는 MockResultSet 은 대체하지 않는 것이 좋다.