단일 스프링 부트 테스트 속성 재정의
다음 예를 생각해 보겠습니다.
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
properties = {
"some.property=valueA"
})
public class ServiceTest {
@Test
public void testA() { ... }
@Test
public void testB() { ... }
@Test
public void testC() { ... }
}
사용하고 있다SpringBootTest주석의properties설정할 속성some.property이 테스트 스위트의 모든 테스트에 대한 속성 값.이제 이 테스트 중 하나에 대해 이 속성의 다른 값을 설정합니다(예:testC)의 영향을 받지 않습니다.어떻게 하면 좋을까요?Spring Boot 문서의 "Testing" 장을 읽었지만 사용 사례에 맞는 항목을 찾지 못했습니다.
속성은 스프링 컨텍스트 로드 중에 스프링에 의해 평가됩니다.
따라서 컨테이너가 시작된 후에는 변경할 수 없습니다.
회피책으로 여러 클래스로 메서드를 분할하여 고유한 스프링콘텍스트를 작성할 수 있습니다.그러나 테스트 실행 속도가 빨라야 하므로 이는 좋지 않은 생각일 수 있으므로 주의해야 합니다.
더 나은 방법은 테스트 대상 클래스에 세터를 두는 것입니다.some.property테스트에서 이 방법을 사용하여 값을 프로그래밍 방식으로 변경합니다.
private String someProperty;
@Value("${some.property}")
public void setSomeProperty(String someProperty) {
this.someProperty = someProperty;
}
갱신하다
적어도 스프링 5.2.5 및 스프링 부트 2.2.6에서는 가능
@DynamicPropertySource
static void dynamicProperties(DynamicPropertyRegistry registry) {
registry.add("some.property", () -> "valueA");
}
사용하고 있는 경우의 다른 솔루션@ConfigurationProperties:
@Test
void do_stuff(@Autowired MyProperties properties){
properties.setSomething(...);
...
}
JUnit 5에서는 네스트된 테스트를 사용하여 필요한 코드를 줄일 수 있습니다.외부 테스트 클래스에 기본 구성을 추가하고 중첩된 테스트에 재정의 주석을 추가합니다.
다음 항목도 참조하십시오.
- spring-test-junit5에서 중첩 테스트를 사용하는 방법
- https://junit.org/junit5/docs/current/user-guide/ #writing-filename-filename
통합 테스트 중 하나에서도 같은 문제가 발생했지만@ConfigurationProperties그게 핵심이었어요
다른 다양한 방법으로 속성을 설정하려다 실패하자 속성 클래스를 자동화하고 각 테스트에서 원하는 값을 설정하기만 하면 된다는 것을 깨달았습니다.
이게 유닛 테스트였다면저도 속성 클래스를 쉽게 비웃을 수 있었을 거예요
언급URL : https://stackoverflow.com/questions/48570766/override-a-property-for-a-single-spring-boot-test
'programing' 카테고리의 다른 글
| ORA-38104: ON 절에서 참조되는 열은 업데이트할 수 없습니다. (0) | 2023.03.18 |
|---|---|
| woocommerce 함수로 작성된 함수를 덮어쓰려고 합니다.php 파일 (0) | 2023.03.18 |
| $exists가 $cond 내에 있는 조건부 그룹화 (0) | 2023.03.18 |
| Javascript 객체 푸시() 함수 (0) | 2023.03.18 |
| jQuery grep()를 사용한 JSON 배열 필터링 (0) | 2023.03.18 |