[프로젝트] 모킹 클래스의 private 필드에 테스트 데이터 삽입 방법 - `ReflectionTestUtils`

ReflectionTestUtils

  • 는 Spring Framework 에서 제공하는 유틸리티 클래스이다.
    • 테스트 시나리오에서 리플렉션(reflection)을 사용하여 객체의 private 필드에 접근
    • private 메서드를 호출할 때 사용한다.
    • 일반적으로 이러한 작업은 Java의 접근 제어 규칙 때문에 직접적으로는 할 수 없지만, 리플렉션을 사용하면 가능해진다.
    • 일반적으로 모킹된 객체의 경우 별도의 Mockito#when 등을 통하여는 실제 도메인 데이터의 흐름을 테스트 할 수 없기에,
      • 즉, 엔티티의 경우 access level 이 PROTECTED 로 보통 설계되어있기에, 엔티티안의 값을 전부 채워넣는 건 시간 낭비이기에 해당 리플렉션을 사용함.
    • 해당 테스트용 리플렉션을 사용해야한다.

예제

import org.springframework.test.util.ReflectionTestUtils;

// ...

@Test
void testPrivateFieldAccess() {
    SomeClass instance = new SomeClass();
    
    // private 필드에 값 설정
    ReflectionTestUtils.setField(instance, "privateField", "value");
    
    // private 필드 값 가져오기
    String fieldValue = (String) ReflectionTestUtils.getField(instance, "privateField");
    
    // private 메서드 호출
    String result = (String) ReflectionTestUtils.invokeMethod(instance, "privateMethod", "parameter");
    
    // 검증
    assertEquals("expectedValue", fieldValue);
    assertEquals("expectedResult", result);
}
  • 테스트 코드의 가독성과 유지보수성에 도움을 주는 편리한 기능이지만..
    • 테스트 코드가 객체 자체의 캡슐화를 약화시키는 문제가 있긴합니다.
    • 하지만, 테스트를 위하여 객체자체를 수정하는 행위나 불필요한 필드값까지 채워야하는 피로함을 제거하기 위하여 해당 유틸 클래스는 사용할 만한 가치가 있는 것 같습니다.


Uploaded by N2T