programing

@TestPropertySource는 봄 1.2.6의 AnnotationConfigContextLoader를 사용한 JUnit 테스트에서 작동하지 않습니다.

closeapi 2023. 3. 12. 10:50
반응형

@TestPropertySource는 봄 1.2.6의 AnnotationConfigContextLoader를 사용한 JUnit 테스트에서 작동하지 않습니다.

Spring 4.1.17에서 Spring Boot 1.2.6을 사용하는 경우는 전혀 없는 것 같습니다.RELEASE는 전혀 동작하지 않습니다.응용 프로그램 속성에 액세스하여 필요에 따라 테스트로 덮어쓰기를 원할 뿐입니다(해크를 사용하여 PropertySource를 수동으로 삽입하지 않음).

이거 안 되는데..

@TestPropertySource(properties = {"elastic.index=test_index"})

이것도 아니고..

@TestPropertySource(locations = "/classpath:document.properties")

이것도 아니고..

@PropertySource("classpath:/document.properties")

완전한 테스트 케이스..

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
@TestPropertySource(properties = {"elastic.index=test_index"})
public class PropertyTests {
    @Value("${elastic.index}")
    String index;

    @Configuration
    @TestPropertySource(properties = {"elastic.index=test_index"})
    static class ContextConfiguration {
    }

    @Test
    public void wtf() {
        assertEquals("test_index", index);
    }
}

결과적으로

org.junit.ComparisonFailure: 
Expected :test_index
Actual   :${elastic.index}

3.x와 4.x 사이에 모순되는 정보가 많은 것 같고, 확실히 동작할 수 있는 것을 찾을 수 없습니다.

어떤 통찰이라도 감사히 받겠습니다.건배!

(봄이 이 감시를 고칠 때까지) 가장 좋은 방법은PropertySourcesPlaceholderConfigurertest.properties(또는 원하는 것)를 불러옵니다.@Import또는 그것을 확장한다.@Configuration.

import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import java.io.IOException;

@Configuration
public class PropertyTestConfiguration {
    @Bean
    public PropertyPlaceholderConfigurer propertyPlaceholderConfigurer() throws IOException {
        final PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        ppc.setLocations(ArrayUtils.addAll(
                        new PathMatchingResourcePatternResolver().getResources("classpath*:application.properties"),
                        new PathMatchingResourcePatternResolver().getResources("classpath*:test.properties")
                )
        );

        return ppc;
    }

}

이를 통해 application.properties에서 기본값을 정의하고 test.properties에서 기본값을 덮어쓸 수 있습니다.물론 여러 개의 스킴이 있는 경우,PropertyTestConfiguration필요에 따라서, 수업을 실시합니다.

그리고 이것을 단위 테스트에 사용합니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
public class PropertyTests {
    @Value("${elastic.index}")
    String index;

    @Configuration
    @Import({PropertyTestConfiguration.class})
    static class ContextConfiguration {
    }
}

제가 사용한 것은locations의 특성@TestPropertySource속성을 덮어쓰거나 추가합니다.

이것은 나에게 효과가 있었다(스프링 4.2.4):

@TestPropertySource(locations = {
   "classpath:test.properties",
   "classpath:test-override.properties" })

그러나 다음과 같은 속성을 덮어쓰지는 않았습니다.

@TestPropertySource(
  locations = {"classpath:test.properties"},
  properties = { "key=value" })

javadoc은 이러한 속성이 가장 높은 우선순위를 갖는다고 하지만,벌레가 아닐까?

갱신하다

이 버그는 Spring 부트버전 1.4.0 이후에 수정될 것입니다.문제를 종료하는 커밋을 참조해 주세요.지금까지 제시된 방법으로 선언된 속성이 우선되어야 합니다.

@Value를 사용하려면 PropertySourcesPlaceholderConfigr bean이 필요합니다.${...}플레이스 홀더승인된 답변은 여기를 참조하십시오.@Value는 Java 구성 테스트 컨텍스트에서 설정되지 않습니다.

이 문제가 있고 yaml을 속성 파일로 사용하려는 경우 해당 봄에 유의하십시오.@TestPropertySource그리고.@PropertySourceyaml 파일에서는 동작하지 않으며 속성이 올바르게 로드되지 않습니다.

https://github.com/spring-projects/spring-boot/issues/10772#issuecomment-339581902

Me의 경우 @TestPropertySource("classpath:xxxxxxxxxx.properties")가 동작했습니다.

사용해보셨습니까?@PropertySource("classpath:document.properties")또는@PropertySource("classpath*:document.properties")?

@TestPropertySource에 문제가 있었습니다.test.properties를 찾을 수 없습니다.

아래는 수정 전의 것입니다.

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = ExtContext.class)
@TestPropertySource(locations = "classpath: test.properties")

classpath:와 test.properties 사이의 공간을 다음과 같이 제거했습니다.

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = ExtContext.class)
@TestPropertySource(locations = "classpath:test.properties")

test.properties가 classpth에 없을 때, 당신에게도 도움이 되지 않습니다.

언급URL : https://stackoverflow.com/questions/32633638/testpropertysource-doesnt-work-for-junit-test-with-annotationconfigcontextload

반응형