최근에 처음으로 써보기 mocking framework이다. easymock이 유명해서 먼저 해볼려고 했습니다. 사용방법이 잠깐만 봐서는 도저히 알기가 힘들었다. 그러다가 발견한게 mockito인데 직관적인게 쉽게 만들어져 있어서 맘에 든다. 딱 내가 생각하는데로 작성된다.
여기엔 그 방법중에 샘플예제(내가 봤던 예제가 오래된거 같다. 1.8 예제에 나와 있네 ㅡㅡ;;)에 안 나온 void 메소드 테스팅 방법을 소개한다.
=> 수정한다. 예제에 나와있는 doReturn 방법을 소개한다.
내가 자주 사용하는 방법 메소드는
// service
@Service("service")
public class Service {
@Resource(name="callDao")
private CallDao dao;
private void setDao(CallDao dao) {
dao = dao;
}
public void somthing(VO object) {
// somthing
dao.call(object);
}
}
// dao
public class CallDao extend SqlMapClientDaoSupport {
public void call(VO object) {
getSqlMapTemplete.getObject("query", object, object);
}
}
위와 같은 결과에서 somthing을 테스팅하기엔 단순하게 예제만 바로 보면 easymock에서 void 메소드 테스트 방법이 쉬워 보지가 않았다.
하지만 mockito에서 아주 쉽게 해결된다.
test 방법
import static org.mockito.Mockito.*
@RunWith(SpringJUnit4ClassRunner.class)
public class ServiceTest {
private Serivce service;
private CallDao dao;
@Before
public void setUp() {
dao = mock(CallDao.class);
serivce = new Serivce();
service.setCallDao(mock);
}
@Test
public void testSomthing() {
VO object= new VO();
doAnswer(new Answer() {
public
Object answer(InvocationOnMock invocation) {
VO returnObject = (VO)invocation.
getArguments()[0];//returnObject 처리
returnObject.setA(0);
return null;
}).when(dao)
.call(object);service.somthing(object);
assertEquals(0,object.getA());
verify(dao).call(object);
}
@Test
public void testSomthing() {
VO object= new VO();
doThrow(new RuntimeException()
).when(dao)
.call(object);service.somthing(object);
assertEquals(0,object.getA());
verify(dao).call(object);
}
}
위와 같이 하면 된다.
ps. 혹시라도 이 글을 보고 틀린 부분이 있으면 댓글 달아주세요.
TDD 따라서 제대로 해보는게 처음이라 틀린점이 있을수 있습니다.