一尘不染

@TestPropertySource不适用于Spring 1.2.6中带有AnnotationConfigContextLoader的JUnit测试

spring

在Spring 4.1.17中使用Spring Boot 1.2.6.RELEASE似乎没有任何作用。我只想访问应用程序属性,并在必要时用测试覆盖它们(无需使用hack手动注入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之间有很多相互矛盾的信息,我找不到可以肯定使用的任何信息。


阅读 613

收藏
2020-04-16

共1个答案

一尘不染

事实证明,最好的方法(直到Spring修复此监督)是一种PropertySourcesPlaceholderConfigurer将引入test.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 {
    }
}
2020-04-16