private로 선언한 메소드를 테스트하고 싶었는데, private로 선언된 메소드는 외부에서 접근이 불가능하므로 테스트를 할 수 없었다.
그래서 임시로 public으로 바꾸고 테스트를 진행하였다.
하지만 나중에 프로젝트의 크기가 커지면. 테스트의 규모가 커지면.
그 과정에서 내가 public으로 바꾼 것을 다시 private으로 바꾸는 것을 잊으면?
이런 이슈에 대해 알아보았다.
1. 많은 경우 private 메소드는 public 메소드 안에 존재한다.
공용 메소드만을 외부로 노출시킨다는 원칙을 따른다면, private 메소드는 밖에서 쓰이는 것이 아니라 안에서 쓰이는 것이기 때문.
따라서 우린 public 메소드를 통해 간접적으로 테스트 할 수 있다.
이 방법이 제일 자연스럽다.
2. 하지만 private메소드만을 따로 작성해야 하는 경우가 있을 수 있다. 또는 그렇게 하고싶은 경우가 있다.
내가 생각 한 방법과 비슷하게, protected, default 접근제어자로 바꾸어 테스트 할 수 있다.
테스트를 위해 코드의 접근 범위를 넓히는 것은 클래스의 노출을 의미하므로 바람직하지 않을 수 있다.
하지만 public 메소드를 통해 테스트 할 수 없어서 이 방법을 택한다는 것은 설계가 이상하다는 신호일 수 있다.
3. Reflection을 이용하여 강제적으로 private 메소드를 호출할 수 있다.
하지만 이렇게 하면 메소드 이름이 String으로 넘겨지므로 complie 할 때 메소드명의 오타가 검증되지 못한다.
refactoring으로 메소드명을 바꾸어도 자동으로 String으로 적힌 부분은 바뀌지 않는다.
이 경우를 다 고려해보고도 필요하다 생각되는 경우에 제한적으로 사용하길 권장한다고 한다.
(reflection으로 메소드를 불러와봤는데 private이면 여전히 불러와지지 않는다. reflaction에 대한 개념이 부족한 것 같다.)
4. 메소드와 같은 위치에서 테스트를 진행한다.
베포시에는 반드시 테스트코드를 삭제해야하며, 이 또한 추천하는 방법은 아니라고 한다.
'JUnit (Test)' 카테고리의 다른 글
@TestMethodOrder (0) | 2021.01.31 |
---|---|
JUnit 의 @TestInstance (0) | 2021.01.31 |
JUnit 5 새로 배운 것 (0) | 2021.01.30 |
JUnit5 이 무엇입니까? (0) | 2021.01.29 |
Exception 테스트하기 (0) | 2020.12.06 |