在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之间有很多相互矛盾的信息,我找不到可以肯定使用的任何信息。
事实证明,最好的方法(直到Spring修复此监督)是一种PropertySourcesPlaceholderConfigurer将引入test.properties(或任何你想要的东西)@Import或扩展它的方法@Configuration。
PropertySourcesPlaceholderConfigurer
test.properties
@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根据需要配置该类。
PropertyTestConfiguration
并在单元测试中使用它。
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(loader = AnnotationConfigContextLoader.class) public class PropertyTests { @Value("${elastic.index}") String index; @Configuration @Import({PropertyTestConfiguration.class}) static class ContextConfiguration { } }