2017년 3월 8일 수요일

[java][junit] private인 메소드는 어떻게 테스트를 해야 하나요?

오늘 JUNIT테스트 케이스를 작성하려고 하는데 이상한 것을 봤습니다.
바로 제가 테스트할 메소드가 JUNIT 테스트 케이스 안에 들어있는 것이었습니다.
상황이 뭐냐하면
다른 누군가가 해당 메소드가 privat으로 되어 있었기 때문에 JUNIT에서 불러 올 수 없었던 것이지요. 그래서 똑같은 메소드를 만들어서 테스트를 했던 것입니다.
문제는 이 테스트가 나중에 쓸모 없어진다는 것같아요.
테스트를 나중에 돌려도 잘된다고 나오겠죠. 버그가 있어도
그러면 JUNIT은 어떻게 테스트를 해야 하는거지?
간접적인 테스트를 하는 것이 방법일 것 같아요. private메소드를 사용하는 public 메소드는 최소한 하나는 있을 것이니 그것을 이용해서 테스트를 하는 것입니다.
하지만 그것으로 부족하다고 느끼시다면?
방법이 있습니다. 리플렉션을 사용하는 방법이죠.
코드를 보겠습니다.
import java.util.List;

public class A {
	private String name;
	public A (String name) { this.name = name; }
	
	private String dosthPrivate(int a, String b, List list) {
	  return "name: " + this.name + 
            ", a: " + a + ", b: " + b + ", List: " + list;
	}
}
현재 위에 있는 dosthPrivate은 실행할 방법이 없습니다.
JUnit으로 테스트를 하려면 어떻게 해야 할까요??
이제 테스트 코드를 보도록 합니다.
public class ATest {
  A a = new A("TEST");
  @Test
  public void test() throws Exception{
  Method method = 
    A.class.getDeclaredMethod("dosthPrivate", int.class, 
                              String.class, List.class);
    method.setAccessible(true);
    String result = String.class.cast(method.invoke
      (a, 1, "BBB", new ArrayList(Arrays.asList(1,2,3,5,8,13,21))));
    assertThat(result, CoreMatchers.is
      ("name: TEST, a: 1, b: BBB, List: [1, 2, 3, 5, 8, 13, 21]"));
  }
}
아주 간단하죠?

아주 간단합니다.

댓글 없음 :

댓글 쓰기