java - 是否可以通过 JUNIT 测试属性注入(inject)的正确性?

标签 java spring spring-boot junit

我已经开发了我的应用程序,并且有一个包含多个键值属性的 .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/

相关文章:

java - Lagom - 使用 header 测试服务调用

java - 在 Firebase 中按日期分组返回的记录

java - 是否可以在 Spring Shell 中对值进行制表符补全?

java - Spring security - authorizerequest()、anyRequest() 和authenticated() 有什么作用?

java - 在 application.yml 中设置根日志级别

java - 如何为此 XML 配置编写 Java 配置?

java - 如何将数据绑定(bind)到 spring 表单中的列表

java - @RequestMapping 方法中的 spring mvc 中使用哪种返回类型?

java - 马文。运行测试时跳过插件执行

java - 与java对象的混淆