ReflectionTestUtils
- 는 Spring Framework 에서 제공하는 유틸리티 클래스이다.
- 테스트 시나리오에서 리플렉션(reflection)을 사용하여 객체의 private 필드에 접근
- private 메서드를 호출할 때 사용한다.
- 일반적으로 이러한 작업은 Java의 접근 제어 규칙 때문에 직접적으로는 할 수 없지만, 리플렉션을 사용하면 가능해진다.
- 일반적으로 모킹된 객체의 경우 별도의 Mockito#when 등을 통하여는 실제 도메인 데이터의 흐름을 테스트 할 수 없기에,
- 즉, 엔티티의 경우 access level 이
PROTECTED
로 보통 설계되어있기에, 엔티티안의 값을 전부 채워넣는 건 시간 낭비이기에 해당 리플렉션을 사용함.
- 즉, 엔티티의 경우 access level 이
- 해당 테스트용 리플렉션을 사용해야한다.
예제
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
'자바 > 리팩토링' 카테고리의 다른 글
__mysql 5.7 에서 H2 1.4.200 호환을 위한 SCHEMA 수정__ (0) | 2024.02.07 |
---|---|
@MybatisTest 클래스 레벨의 @Sql 이 수행되지 않는 경우 (0) | 2024.02.06 |
[프로젝트] 시큐리티 권한 체크 `@PreAuthorize 또는 @Secured` (0) | 2024.02.02 |
[프로젝트] RestDocs 커스텀 유저 모킹 `@MockMember` 적용기 (0) | 2024.02.02 |
[리팩토링] properties 파일을.. yaml 로 변경하면서 생긴, gradle 문제 해결 (0) | 2024.01.19 |