【发布时间】:2015-10-23 01:46:05
【问题描述】:
我想测试依赖于加载有@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 上方的示例中。
在阅读 cmets 时,我已经注意到这不再是单元测试了。然而,为这个小测试使用完整的 Spring 引导配置对我来说似乎有点太多了。这就是为什么我问是否有可能只加载一个具有属性的类。
【问题讨论】:
-
您可以尝试使用 Mockito 的
Whitebox.setInternalState(object, fieldName, value)方法将值“注入”到对象中。 Example -
你可以看看
MockitoAnnotations.initMocks(java.lang.Object)是如何工作的,并将其扩展到@ConfigurationProperties和@Autowired(可能已经适用,但我不确定)。 -
@Roman Vottner:感谢您的提示。问题是,我想模拟的不仅仅是一个字段,它是 10 个。所以这将是一些写作工作。如果只是那个单元测试,那没什么可抱怨的,但我想要有很多,所以有一个更简单的方法会非常有帮助。
-
如果您为几个测试“注入”相同类型的对象,只需将指令重构为辅助方法并在这些测试中调用此方法。您还可以参数化此方法以注入某些对象。您还可以考虑一种构建器设置,如果没有调用特定于构建器的方法,则“注入”默认值,如果设置了相应的构建器方法,则设置具体的注入值。
-
你到底想做什么?从我看到的示例中,您似乎正在测试框架(您不应该)。您可能对此答案感兴趣stackoverflow.com/questions/31692863/…
标签: java properties spring-boot