我想测试依赖于@Autowired和加载的属性的应用程序的一小部分@ConfigurationProperties。我正在寻找一个仅加载所需属性而不是整个加载的解决方案ApplicationContext。这里作为简化示例:
@Autowired
@ConfigurationProperties
ApplicationContext
@TestPropertySource(locations = "/SettingsTest.properties") @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {TestSettings.class, TestConfiguration.class}) public class SettingsTest { @Autowired TestConfiguration config; @Test public void testConfig(){ Assert.assertEquals("TEST_PROPERTY", config.settings().getProperty()); } }
配置类别:
public class TestConfiguration { @Bean @ConfigurationProperties(prefix = "test") public TestSettings settings (){ return new TestSettings(); } }
设置类别:
public class TestSettings { private String property; public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } }
资源文件夹中的属性文件包含以下条目:
test.property=TEST_PROPERTY
在我当前的设置中,配置不为null,但是没有可用字段。字段不是字段的原因应该与我不是使用Springboot而是使用Spring有关。那么,Springboot怎样运行它呢?
编辑: 我想要这样做的原因是:我有一个解析器来解析文本文件,所使用的正则表达式存储在属性文件中。为了对此进行测试,我只想加载此解析器所需的属性,这些属性位于 TestSettings 上方的 示例中 。
在阅读注释时,我已经注意到这不再是单元测试了。但是,对于这个小测试,使用完整的Spring引导配置对我来说似乎有点过多。这就是为什么我问是否有可能只向一个类加载属性。
几点:
您在主程序包中不需要“ TestConfiguration”类,因为它所做的只是配置“ TestSettings” bean。您可以简单地通过注释TestSettings类本身来做到这一点。
通常,您将使用 @SpringApplicationConfiguration 批注加载测试所需的上下文,并传递Application类的名称。但是,您说过您不想加载整个ApplicationContext(虽然尚不清楚原因),所以您需要创建一个特殊的配置类来仅对测试进行加载。在下面,我将其称为“ TestConfigurationNew”,以避免与您最初拥有的TestConfiguration类混淆。
在Spring Boot的世界中,所有属性通常都保存在“ application.properties”文件中。但可以将它们存储在其他位置。在下面,我指定了您建议的“ SettingsTest.properties”文件。请注意,您可以拥有此文件的两个副本,一个在main / resources文件夹中,一个在test / resources文件夹中用于测试。
更改代码,如下所示:
TestSettings.java(在主包中)
@Configuration @ConfigurationProperties(prefix="test", locations = "classpath:SettingsTest.properties") public class TestSettings { private String property; public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } }
SettingsTest.java(在测试包中)
@TestPropertySource(locations="classpath:SettingsTest.properties") @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = TestConfigurationNew.class) public class SettingsTest { @Autowired TestSettings settings; @Test public void testConfig(){ Assert.assertEquals("TEST_PROPERTY", settings.getProperty()); } }
TestConfigurationNew.java(在测试包中):
@EnableAutoConfiguration @ComponentScan(basePackages = { "my.package.main" }) @Configuration public class TestConfigurationNew { }
现在,这应该可以按照您想要的方式工作。