추상 클래스에 행위에 대해서 테스트가 필요하다면, 방법이 있다.  EP님이 블로그 덧글을 남긴 것을 보고 좀더 구체적으로 직접 물어봐서 좋은 가이드를 얻을 수가 있었다. 추상클래스 단위 테스트 만들기를  보고 이어서 보면 더 이해가 쉬울 것이다.

대부분 hook메소드와 같은 콜백 메소드가 부모의 알고리즘(비즈니스 로직)에 따라서 정상적으로 잘 호출이 되는지를 체크할 수 있는 테스트이다.

아이디어는 이렇다. EP님의 덧글을 참조하자.

여러 개의 메서드를 구현할 것을 기대하고 이를 정해진 순서대로 실행하는 추상 클래스를 테스트할 때에는 로그 찍는 방법도 좋습니다. 다만 로그를 사람이 눈으로 확인하는 것이 아니라 로그를 남기고 기대하는 로그를 단언하면 됩니다. - EP

구현은 이렇게 했다. 메소드가 호출되는 것을 Stack에 로그로 담아두고, 테스트를 원하는 메소드를 호출후에 원하는 메소드들이 호출이 되고, 원하는 상태로 변경이 되어있는지에 대한 테스트를 하는 것이다. 호출된 로그는 Stack에 담아서 pop을 하면서 비교를 하였다.

이정도의 테스트이면,
상태와 행위를 둘다 테스트를 해서 좀더 견고하고 원하는 테스트를 할수 있을 것이다.
public class AbstractBlogTemplateClientTest extends TestCase {
final Stack<String> methodStack = new Stack<String>();
 
 protected void setUp() throws Exception {
  super.setUp();
  leverageDAO = createMock(LeverageDAO.class);
  abstractBlogTemplateClient = new AbstractBlogTemplateClient(){
   @Override
   protected SourceType getSourceType() {
    methodStack.push("getSourceType");
    return SourceType.RECIPE;
   }
   @Override
   protected Leverage getLeverage(Post post) {
    getSourceType();
    methodStack.push("getLeverage");
    return leverage;
   }
   @Override
   protected void resultSyncCallback(Post post, RemoteResult remoteResult) throws Exception {
    methodStack.push("resultSyncCallback");
   }
   @Override
   protected RemoteResult insert(Post post) throws Exception {
    methodStack.push("insert");
    return remoteResult;
   }
   @Override
   protected RemoteResult update(Post post) throws Exception {
    methodStack.push("update");
    return remoteResult;
   }
   @Override
   protected RemoteResult delete(Post post) throws Exception {
    methodStack.push("delete");
    return remoteResult;
   }
  };
  abstractBlogTemplateClient.setLeverageDAO(leverageDAO);
 }
 @Override
 protected void tearDown() throws Exception {
  super.tearDown();
  methodStack.clear();
 }
 public void test_insertToOuter() throws Exception {
  leverageDAO.insertLeverage(leverage);
 
  replay(leverageDAO);
  assertTrue(post.getLeverageSet().size() == 0);
 
  abstractBlogTemplateClient.insertToOuter(post);
 
  verify(leverageDAO);
 
  // state test
  assertTrue(post.getTemplateSync());
  assertFalse(post.getTemplateCopyYn());
  assertNotNull(post.getTemplateSyncdate());
  assertTrue(post.getLeverageSet().size() == 1);
 
  // method call test : behavior
  assertEquals(4, methodStack.size());
  assertEquals("getLeverage", methodStack.pop());
  assertEquals("getSourceType", methodStack.pop());
  assertEquals("resultSyncCallback", methodStack.pop());
  assertEquals("insert", methodStack.pop());
 }
}

메소드가 호출되는 것을 체크할 뿐만 아니라 호출된 순서까지도 체크를 할수가 있다.


Posted by ologist

블로그 이미지
ologist

공지사항

Yesterday191
Today136
Total34,708

달력

 « |  » 2012.02
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

최근에 받은 트랙백

글 보관함