👩🏻‍💻 Programming/Java

private 필드에 ReflectionUtils로 값을 셋팅해서 테스트 코드 작성

한국의 메타몽 2024. 10. 23. 20:48

private 필드가 있는 클래스

 

@RequiredArgsConstructor  
@Service  
public class TestEventService {  

  private final SomeClient someClient;  

  @Value("${test.event.key}")  
  private String key;  

  @Value("${test.event.sequence}")  
  private String sequence;

 

위와 같이 Service 클래스에 private 접근 제어자로 선언된 필드가 있었다.
@Value 어노테이션을 통해 빌드 환경별 고유 값을 가져오고 있는 상황이다.
어느 환경에서도 불변의 값이 아닌 환경에 따라 다른 값을 가져오는 상황이다보니, 유닛 테스트를 작성하는데 애로사항이 있다.

 

ReflectionUtils를 사용하자

 

리플렉션의 기본 개념은 여기를 통해 확인할 수 있다.
한 줄 요약하자면 런타임 시점에 클래스의 메타데이터(ex : 필드, 메서드)를 검사하고,
해당 클래스의 private 접근제어자 영역까지 접근을 가능하게 해주는 것이 리플렉션의 핵심이다.

 

이를 기반으로 동작하는 ReflectionUtils를 통해 private과 같은 접근 제어자에도 값을 셋팅하는 로직을 작성할 수 있다.

 

아래는 ReflectionUtils를 사용해 private 접근 제어자에 값을 셋팅하는 예시 테스트 코드다.

 


private final String KEY = "TEST-EVENT";  
private final String SEQUENCE = "11";

@InjectMocks  
private TestEventService target;  

@Mock  
private SomeClient someClient;  

@BeforeEach  
void setUp() {  
  ReflectionTestUtils.setField(target, "key", KEY);
  ReflectionTestUtils.setField(target, "sequence", SEQUENCE);  
}