프레임워크/스프링

[스프링] 테스트 유틸리티 클래스 ReflectionTestUtils

believekim 2025. 4. 22. 23:35

 

배달 어플리케이션 과제가 주어졌다.
나는 리뷰기능을 맡게 되었는데 상점과 메뉴가 만들어져있지 않다 보니 테스트를 진행할 수 없었다.

 

 

1. ReflectionTestUtils

  • Spring에서 제공하는 테스트 유틸리티 클래스
  • org.springframework.test.util.ReflectionTestUtils
  • 보통 private로 선언되어 있거나 setter가 없어서 직접 값을 주입하기 어려운 상황을 해결
// Review 클래스에 setContent()가 없어도 private String content 필드에 값을 강제로 주입
Review review = new Review();
ReflectionTestUtils.setField(review, "content", "정말 맛있어요!");

2. 대표적인 메서드

메서드 설명
setField(Object target, String name, Object value) 해당 객체의 private 필드에 강제로 값을 세팅
getField(Object target, String name) 해당 객체의 private 필드 값을 가져옴
invokeMethod(Object target, String methodName, Object... args) private 메서드 실행

 

3. 예시코드

  • 예시 코드를 위한 예시 클래스
public class Person {
    private String name = "기본 이름";
    private int age = 20;

    private String greet(String prefix) {
        return prefix + " " + name;
    }
}

 

  • setField() -> private 필드 값 강제로 설정하기
Person person = new Person();
ReflectionTestUtils.setField(person, "name", "홍길동");

 

  • getField -> private 필드 값 가져오기
Object nameValue = ReflectionTestUtils.getField(person, "name");

System.out.println("이름: " + name);  
// 결과: 이름: 홍길동

 

  • invokeMethod -> private 메서드 실행하기
Person person = new Person();
ReflectionTestUtils.setField(person, "name", "이순신");

Object result = ReflectionTestUtils.invokeMethod(person, "greet", "안녕하세요");

System.out.println(result);  
// 결과: 안녕하세요 이순신