是否可以通过JUNIT测试属性注入的正确性?

时间:2017-12-28 15:12:31

标签: java spring spring-boot junit

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

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

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

有可能吗?

1 个答案:

答案 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服务)。

注意:如果您发现很难测试您的应用程序,因为依赖性太多,或者外部依赖关系无法轻易换出,您感觉到的痛苦是开始思考如何改变的良好指导您的架构,以支持易于测试。您也可以使用上述概念测试部分应用程序。

相关问题