我开发了我的应用程序,并且我有一个包含多个键值属性的.properties文件。 在我的代码中,我注入了这样的属性:
@Value("${services.host}${services.name}")
private String hostname;
我正在寻找一种方法来检查我的代码中的每个@Value,以确保每个属性都将在运行时解决。像模拟我的应用程序启动一样。
有可能吗?
答案 0 :(得分:1)
是的,您可以创建一个JUnit测试类来加载您的应用程序上下文(就像您的生产代码一样),然后执行一个测试方法来验证您的属性值是否已经注入。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppConfig.class})
public class SpringApplicationTest {
@Autowired
private MyServiceBean serviceBean;
@Test
public void shouldExecuteServiceBean_andProduceExpectedOutcome() {
//TODO test setup
serviceBean.doSomething()
//TODO assert output
}
}
在此示例中,MyServiceBean.java
是一个将从Main
类执行的类,因此您正在测试应用程序的端到端逻辑,包括所有弹簧依赖注入。将其视为您的“快乐路径”测试场景。我总是在我的项目中包含至少一个这样的测试,以确保所有弹簧注入都是正确的并且无错误地加载。在构建和部署代码之前,您不会发现错误。
在上面的示例中,AppConfig.java
与部署代码时使用的Spring配置类相同。您可能希望添加另一个配置类来覆盖某些属性/ bean,专门用于测试。
@ContextConfiguration(classes = {AppConfig.class, TestConfig.class})
使用仅测试类,您可以模拟任何使测试困难的依赖项(即使用in-memory database),并覆盖属性,以便您可以测试“localhost”而不是其他可能或可能的服务不可用(只要您可以在测试设置中创建等效的localhost服务)。
注意:如果您发现很难测试您的应用程序,因为依赖性太多,或者外部依赖关系无法轻易换出,您感觉到的痛苦是开始思考如何改变的良好指导您的架构,以支持易于测试。您也可以使用上述概念测试部分应用程序。