SpringBoot Test - 可以针对默认应用程序上下文运行测试吗?

Posted

技术标签:

【中文标题】SpringBoot Test - 可以针对默认应用程序上下文运行测试吗?【英文标题】:SpringBoot Test - possible to run tests against the default application context? 【发布时间】:2020-11-30 11:13:47 【问题描述】:

执行 Spring Boot 应用程序的 JUnit 测试会导致应用程序的测试上下文在调用测试时启动。有没有办法针对已经启动的 Spring Boot 应用程序运行此测试,而无需为测试启动第二个应用程序上下文?例如,是否可以指示测试框架使用已经启动的现有应用程序上下文?

@SpringBootTest
@RunWith(SpringRunner.class)
public class MyAppTests 

    @Autowired
    public SomeService someService;

    @Test
    public void testInjection() throws AssertionError 
        Assert.assertTrue(someService != null);
    


【问题讨论】:

不清楚您要测试什么。暂时忘记您正在使用弹簧靴。您是想针对已经在运行的真实应用程序进行测试并将其视为黑盒,还是想通过用模拟或存根替换某些部分来测试真实应用程序的某些部分? 我想从容器服务中定期对容器运行 api 测试,例如通过绑定到 /execute-all-api-tests 之类的 URL 的 rest 控制器,它将在成功时返回 200 响应或在失败时返回错误,然后可以将其与 Web 监控集成以检测 API 何时无法正常运行。这些基本上是在操作环境中运行的集成测试。 【参考方案1】:

如果在您描述的前提下,没有方法可以仅使用已启动的应用程序上下文运行测试,同时不启动第二个测试应用程序。

这意味着Spring Boot应用程序的JUnit测试是一种白盒测试,测试用例只会在自己启动的环境中运行。测试用例与其他已经运行的应用上下文无关。

但是,如果您真的想针对已经启动的 Spring Boot 应用程序(就像正在运行的测试环境)运行测试,也许您可​​以尝试一些其他的黑盒测试,例如 API 测试或 GUI 测试。但它不允许你直接测试SomeService 类。

【讨论】:

是的,我可能会过渡到那种方法——尽管我喜欢 spring 工具套件中的 JUnit 接口,可以快速运行并查看集成测试的结果,所以我希望能够继续使用JUnit 框架来运行这些测试。不确定这是否仍然可行——为了在测试类中获得依赖注入来检查配置,我不得不使用在 spring 测试框架的其余部分中引入的注释。也许有一个简单的解决方案可以避免这种情况。【参考方案2】:

如下更新你的测试类,它应该可以解决你的问题。

@SpringBootTest
@RunWith(SpringRunner.class)
@SpringApplicationConfiguration(classes = YourApplication.class)
@ActiveProfiles(Constants.SPRING_PROFILE_DEVELOPMENT)
public class MyAppTests 

【讨论】:

这不起作用。在这个问题上花了很多时间之后,我很确定 Peter Quan 是正确的,即没有办法对活动(非测试)容器运行弹簧测试。我一直在寻求覆盖测试环境使用的 Web 应用程序上下文的位置的可能性,以强制它使用已经被缓存的正在运行的容器(这可能会做一些类似于你对配置文件建议的事情) - 但是春天boot 默认使用数据库来存储配置。我现在只需要满足于第二个容器。

以上是关于SpringBoot Test - 可以针对默认应用程序上下文运行测试吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java教程:Springboot项目如何使用Test单元测试

SpringBoot测试方法说明

SpringBoot中的测试(test)

SpringBoot-缓存管理

SpringBoot----SpringBoot配置日志文件

Test1