@TestPropertySource不适用于春季1.2.6中使用NotsellIngConfigContextLoader的JUnit测试

2022-09-01 05:59:53

似乎我在Spring 4.1.17中用Spring Boot 1.2.6.RELEASE所做的任何事情都不起作用。我只想访问应用程序属性,并在必要时使用测试覆盖它们(无需使用hack手动注入属性源)

这不起作用..

@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

事实证明,最好的方法(直到Spring修复此疏忽)是引入test.properties(或任何你想要的东西)和/或扩展它。PropertySourcesPlaceholderConfigurer@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 {
    }
}

答案 2

我使用 的属性来覆盖(或添加)属性。locations@TestPropertySource

这对我有用(春季4.2.4):

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

但是,覆盖如下属性并未:

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

即使javadoc说这些属性具有最高的优先级。也许是一个错误?

更新

该错误应在Spring boot版本1.4.0及更高版本中修复。请参阅关闭问题的提交。到目前为止,以呈现方式声明的属性应优先。


推荐