2011년 11월 28일 월요일

Mockito void method testing 방법


최근에 처음으로 써보기 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 따라서 제대로 해보는게 처음이라 틀린점이 있을수 있습니다.