바로 제가 테스트할 메소드가 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]"));
}
}
아주 간단하죠?네
아주 간단합니다.
댓글 없음:
댓글 쓰기