복붙노트

[SPRING] @TestPropertySource가 Spring 1.2.6의 AnnotationConfigContextLoader를 사용하는 JUnit 테스트에서 작동하지 않습니다.

SPRING

@TestPropertySource가 Spring 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 사이에 많은 상충되는 정보가있는 것 같아서 확실하게 작동하는 것을 찾을 수 없습니다.

모든 통찰력은 감사하게 감사 할 것입니다. 건배!

해결법

  1. ==============================

    1.가장 좋은 방법은 Spring이이 감독을 수정할 때까지 test.properties (또는 원하는대로)를 가져오고 @Configuration을 가져 오거나 확장하는 PropertySourcesPlaceholderConfigurer입니다.

    가장 좋은 방법은 Spring이이 감독을 수정할 때까지 test.properties (또는 원하는대로)를 가져오고 @Configuration을 가져 오거나 확장하는 PropertySourcesPlaceholderConfigurer입니다.

    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 {
        }
    }
    
  2. ==============================

    2.@TestPropertySource의 locations 속성을 사용하여 속성을 재정의하거나 추가했습니다.

    @TestPropertySource의 locations 속성을 사용하여 속성을 재정의하거나 추가했습니다.

    이것은 나를 위해 일했다 (봄 4.2.4) :

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

    그러나 아래와 같은 속성을 재정의하지 않았습니다.

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

    javadoc에서는 이러한 속성이 우선 순위가 가장 높다고 말합니다. 어쩌면 버그일까요?

    최신 정보

    버그는 스프링 부트 버전 1.4.0 이상에서 수정되어야합니다. 문제를 해결하는 커밋을 참조하십시오. 지금까지 제시된 방식으로 선언 된 속성이 우선되어야합니다.

  3. ==============================

    3.@Value를 사용하려면 $ {...} 자리 표시자를 확인하기 위해 PropertySourcesPlaceholderConfigurer bean이 필요합니다. 여기에 수락 된 대답을보십시오 : @Value는 Java 설정 테스트 컨텍스트를 통해 설정되지 않습니다.

    @Value를 사용하려면 $ {...} 자리 표시자를 확인하기 위해 PropertySourcesPlaceholderConfigurer bean이 필요합니다. 여기에 수락 된 대답을보십시오 : @Value는 Java 설정 테스트 컨텍스트를 통해 설정되지 않습니다.

  4. ==============================

    4.나를 위해 @TestPropertySource ( "classpath : xxxxxxxx.properties")가 작동했습니다.

    나를 위해 @TestPropertySource ( "classpath : xxxxxxxx.properties")가 작동했습니다.

  5. ==============================

    5.@PropertySource ( "classpath : document.properties") 또는 @PropertySource ( "classpath * : document.properties")를 사용해 보셨나요?

    @PropertySource ( "classpath : document.properties") 또는 @PropertySource ( "classpath * : document.properties")를 사용해 보셨나요?

  6. from https://stackoverflow.com/questions/32633638/testpropertysource-doesnt-work-for-junit-test-with-annotationconfigcontextload by cc-by-sa and MIT license