我已经开发了我的应用程序,并且有一个包含多个键值属性的 .properties 文件。 在我的代码中,我注入(inject)这样的属性:
@Value("${services.host}${services.name}")
private String hostname;
我正在寻找一种方法来检查代码中的每个@Value,以确保每个属性都将在运行时得到解决。比如模拟我的应用程序启动。
可能吗?
最佳答案
是的,您可以创建一个 JUnit 测试类来加载您的应用程序上下文(就像您的生产代码一样),然后执行一个测试方法来验证您的属性值是否已注入(inject)。
@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
类执行的类,以便您测试应用程序的端到端逻辑,包括所有的 spring 依赖注入(inject)。将其视为您的“快乐路径”测试场景。我总是在我的项目中至少包含一项这样的测试,以确保所有 Spring 注入(inject)都是正确的并且加载时没有错误。您不想在构建和部署代码之前捕获错误。
在上面的示例中,AppConfig.java
与您在部署代码时使用的 Spring 配置类相同。您可能想要添加另一个配置类来重写一些专门用于测试的属性/bean。
@ContextConfiguration(classes = {AppConfig.class, TestConfig.class})
使用仅测试类,您可以模拟任何使测试变得困难的依赖项(即使用 in-memory database ),并且还可以覆盖属性,以便您可以针对“localhost”而不是另一个可能是也可能不是的服务进行测试可用(只要您可以在测试设置中创建等效的本地主机服务)。
注意:如果您发现由于依赖项太多或无法轻松替换的外部依赖项而难以测试您的应用程序,那么您所感受到的痛苦是开始考虑如何更改的一个很好的指南您的架构支持轻松测试。您还可以使用上述概念来测试应用程序的部分内容。
关于java - 是否可以通过 JUNIT 测试属性注入(inject)的正确性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48009875/