programing

단일 스프링 부트 테스트 속성 재정의

bestprogram 2023. 3. 18. 09:31

단일 스프링 부트 테스트 속성 재정의

다음 예를 생각해 보겠습니다.

@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에서는 네스트된 테스트를 사용하여 필요한 코드를 줄일 수 있습니다.외부 테스트 클래스에 기본 구성을 추가하고 중첩된 테스트에 재정의 주석을 추가합니다.

다음 항목도 참조하십시오.

통합 테스트 중 하나에서도 같은 문제가 발생했지만@ConfigurationProperties그게 핵심이었어요

다른 다양한 방법으로 속성을 설정하려다 실패하자 속성 클래스를 자동화하고 각 테스트에서 원하는 값을 설정하기만 하면 된다는 것을 깨달았습니다.

이게 유닛 테스트였다면저도 속성 클래스를 쉽게 비웃을 수 있었을 거예요

언급URL : https://stackoverflow.com/questions/48570766/override-a-property-for-a-single-spring-boot-test