본문 바로가기

Programing/테스트

[Spring] 테스트 코드에서 private 필드 처리

면접을 보러 갔다가 까칠하게 생긴 면접관한테 이런 질문을 받은 적이 있다.

클래스에 private 필드가 있는데 테스트를 어떻게 수행하겠느냐?

당시 자바에 대한 공부를 하고 갔기에 리플렉션에 대해서 알고 있어서 리플렉션을 이용하면 private 필드도 접근이 가능하다고 알고 있어서 그렇게 대답을 하였다.


어제 테스트 코드를 작성하다가 private 필드를 조작할 필요가 있었다. 처음에는 리플렉션을 생각했는데 코드가 길어지고 리플렉션 사용법도 찾아봐야 해서 public 세터를 통해 값을 넣을 수 있게 만들었다.

위의 그림에서 세 세터는 실제 테스트를 위해서 만들어진 것이다. 어떻게 보면 객체지향개념중 캡슐화를 깨뜨린 것이다.


오늘 스프링 테스트 프레임워크를 공부를 하다가 스프링에는 리플렉션을 사용하기 쉽게 만들어놓은 유틸리티 클래스가 있었다.

11.2.2 Unit Testing support Classes 에 보면 org.springframework.test.util 패키지는 리플렉션 기반의 유틸티티 메서드들을 가지고 있는 ReflectionTestUtils를 포함한다고 적혀있다.


그래서 내침김에 어제 만들었던 세터를 없애고 리플렉션테스트 유틸을 이용해보았다.

생각보다 코드가 늘었기는 했는데 그리 복잡하지 않았다.


가령 아래 같은 코드가

다음과 같이 바뀌었다.


기존 테스트 대상 클래스(SUT)인 FileCleanUpTask에서는 불필요한 세터 두개가 사라지고 public 메서드는 private로 바뀔 수 있었다.



리플렉션은 접근제어자를 넘어서 어떻게 보면 캡슐화를 깨버리는 역할을 하게 되는므로 테스트 코드 등의 제한적인 용도로 사용하고 오남용을 피해야 될 것으로 생각된다.