我想测试依赖于 @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
在我当前的设置中,配置不为空,但没有可用的字段。 字段不是字段的原因应该与我没有使用 Springboot 而是使用 Spring 的事实有关。 那么 Springboot 的运行方式是什么?
编辑: 我想这样做的原因是:我有一个解析文本文件的解析器,使用的正则表达式存储在一个属性文件中。 为了对此进行测试,我只想加载此解析器所需的属性,这些属性位于 TestSettings 上方的示例中。
在阅读评论时,我已经注意到这不再是单元测试了。然而,为这个小测试使用完整的 Spring 引导配置对我来说似乎有点太多了。这就是为什么我问是否有可能只加载一个具有属性的类。
最佳答案
您需要使用 @EnableConfigurationProperties
注释您的 TestConfiguraion,如下所示:
@EnableConfigurationProperties
public class TestConfiguration {
@Bean
@ConfigurationProperties(prefix = "test")
public TestSettings settings (){
return new TestSettings();
}
}
另外你只需要在你的SettingsTest
类的@ContextConfiguration
中包含TestConfiguration.class
:
@TestPropertySource(locations = "/SettingsTest.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfiguration.class)
public class SettingsTest {
...
关于java - 如何使用 @ConfigurationProperties 和 @Autowired 测试类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31745168/