프레임워크/스프링
[스프링] 테스트 유틸리티 클래스 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);
// 결과: 안녕하세요 이순신