【问题标题】:Is it possible to test the properties injection correctness via JUNIT?是否可以通过 JUNIT 测试属性注入的正确性?
【发布时间】:2018-06-09 03:26:10
【问题描述】:

我已经开发了我的应用程序,并且我有一个包含多个键值属性的 .properties 文件。 在我的代码中,我注入了这样的属性:

@Value("${services.host}${services.name}")
private String hostname;

我正在寻找一种方法来检查我的代码中的每个 @Value,以确保每个属性都将在运行时得到解决。类似于模拟我的应用程序启动。

有可能吗?

【问题讨论】:

  • 你检查spring-boot-starter-test了吗?
  • 但是你为什么要对 spring 框架进行单元测试而不是你的业务逻辑对我来说是个谜

标签: java spring spring-boot junit


【解决方案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 类执行的类,因此您正在测试应用程序的端到端逻辑,包括所有 spring 依赖项注入。将其视为您的“快乐路径”测试场景。我总是在我的项目中至少包含一个这样的测试,以确保所有的弹簧注射都是正确的并且加载没有错误。在构建和部署代码之前,您不希望发现错误。

在上面的示例中,AppConfig.java 是您在部署代码时使用的同一个 Spring 配置类。您可能想要添加另一个配置类来覆盖一些专门用于测试的属性/bean。

@ContextConfiguration(classes = {AppConfig.class, TestConfig.class})

使用仅测试类,您可以模拟任何使测试变得困难的依赖项(即使用in-memory database),并且还可以覆盖属性,以便您可以针对“localhost”而不是另一个服务进行测试,这可能是也可能不是可用(只要您可以在测试设置中创建等效的 localhost 服务)。

注意:如果您发现由于过多的依赖项或外部依赖项无法轻松换出而难以测试您的应用程序,那么您所感受到的痛苦是开始考虑如何更改的好指南您的架构以支持易于测试。您也可以使用上述概念仅测试应用程序的某些部分。

【讨论】:

    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 2021-12-26
    • 2017-09-24
    • 1970-01-01
    • 2011-06-08
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多