JUnit으로 테스트하다 보면 많은 문제들을 만나게 됩니다.
그 중에 이번엔 JUnit으로 private으로 선언된 메소드는 어떻게 테스트할 수 있는지 포스팅해보겠습니다.
아시다싶이 private으로 선언된 메소드나 변수는 외부에서 접근이 불가능합니다.
내부 로직에 의해 결과들이 저장되는 배열이 private으로 선언되있다면 사용을 할 수 없어 이를 토대로 구현된 메소드들을 테스트하기 어렵습니다.
또한, private으로 선언된 메소드들은 호출이 안되니 역시 테스트가 안되겠죠.
그럼 이러한 private으로 선언된 변수나 메소드들을 JUnit으로 어떻게 테스트해야할까요 ?
물론 여러가지 방법이 있을 겁니다. get메소드들을 구현해서 얻을 수 있게 코드를 변경한다던지, 아니면 어떤 라이브러리를 사용한다던지 하는 것들 말입니다. 그러나 안 좋은 방법이 있습니다.
제가 생각했을때 가장 최악의 방법은 바로 해당 메소드나 변수를 public으로 바꾸는 것입니다.
외부 접근을 막기 위해 private으로 선언하여 구현해놨는데 테스트를 하기위해 public으로 바꾸다니요. 이런 일은 절대 있어선 안됩니다.
그럼 private으로 선언된 메소드나 변수를 어떻게 테스트하는지 설명드리겠습니다.
저는 Method와 Field객체를 생성해서 private인 것들을 담고 접근을 허용하는 방식을 설명하겠습니다.
여러 블로그들을 통해 얻은 정보들을 정리한 내용입니다.
우선 사용할 private 메소드를 가진 클래스를 생성합니다.
PrivateClass pclass = new PrivateClass();
메소드를 사용하기 위한 클래스는 생성을 했고 이제 private 메소드를 불러보도록 하겠습니다.
먼저 해당 메소드에 몇 가지 작업을 해야합니다.
메소드를 사용할 것이기때문에 Method 객체를 생성해서 담습니다.
이제 Method 객체를 생성해보겠습니다.
Method method;
Method 객체를 생성하고 해당 객체에 사용하고자 하는 private 메소드를 담아줍니다.
method = pclass.getClass().getDeclaredMethod("메소드 이름", 파라미터, 파라미터);
위와 같은 방식으로 사용하려는 private 메소드를 담아주면 됩니다.
예를 들어 메소드가 다음과 같이 구현되어있다고 했을때
private int PrivateMethod(int a, int b) {
}
method 객체에 다음과 같이 담으면 됩니다.
method = pclass.getClass().getDeclaredMethod("PrivateMethod", int.class, int.class);
이렇게 method 객체에 담고 다음과 같이 접근을 허용해주면 private 메소드에 접근할 수 있게 됩니다.
method.setAccessible(true);
이제 메소드에 대한 접근은 할 수 있게 되었고 테스트를 위해 호출해보도록 하겠습니다.
설정된 private메소드는 invoke 메소드를 사용해서 호출할 수 있습니다.
method.invoke(private 메소드를 가진 클래스명, 파라미터, 파라미터, ...);
이렇게 해당 메소드를 가진 클래스에 파라미터를 전달하면서 invoke 메소드를 호출하면 private 메소드를 사용할 수 있습니다.
그렇다면 변수는 어떻게 접근할까요 ?
역시 메소드와 마찬가지로 필드 객체를 생성해서 접근을 허용하고 사용하면 됩니다.
먼저 메소드와 똑같이 먼저 필드 객체를 생성합니다.
Field field;
필드 객체를 생성했다면 메소드 객체에 메소드를 담았던 것처럼 필드 객체에 사용할 필드를 담습니다.
field = pclass.getClass().getDeclaredField("필드명")
위와 같이 필드명을 전달하여 필드를 담아주면 됩니다.
필드를 담았으니 이제 접근을 허용해줘야됩니다.
field.setAccessible(true);
메소드 객체에서 필드 객체로 바뀌었을뿐 사용법은 동일합니다.
접근을 허용했으니 이제 private으로 선언된 변수도 사용할 수 있게 되었습니다.
'IT > Testing' 카테고리의 다른 글
V모델과 단계별 테스팅 (0) | 2017.12.14 |
---|---|
ISTQB 자격증 소개 및 시험 준비 팁 (0) | 2017.12.12 |
JUnit 소개 (0) | 2017.12.09 |
테스팅 용어 정리 (0) | 2017.12.04 |