通过所有 SpringBootTests 使用一个 Spring Boot 上下文

Posted

技术标签:

【中文标题】通过所有 SpringBootTests 使用一个 Spring Boot 上下文【英文标题】:Use one spring boot context through all SpringBootTests 【发布时间】:2018-01-17 08:55:24 【问题描述】:

我希望能够通过使用 junit 的测试通过不同的类缓存应用程序上下文。

测试类是这样声明的:

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

我看到了这个问题Reuse spring application context across junit test classes,但在这种情况下,我不使用任何 xml,我想完全启动上下文,而不仅仅是其中的几个 bean,所以@SpringBootTest@ContextConfiguration 更合适,如果我没看错。

【问题讨论】:

【参考方案1】:

Ruslan,所以您的问题是如何为 JUnit 套件重用 Spring Boot 上下文,对吧?

然后,它几乎是开箱即用的,您只需要使用@SpringBootTest 注释来注释每个单元测试。

还要确保您的主@SpringBootApplication 类正在加载所有必要的@Configuration 类,如果@SpringBootApplication 位于所有配置类之上的根包中并且继承@ComponentScan,则此过程将自动完成将加载所有这些。

来自 Spring Boot 测试文档:

Spring Boot 提供了一个 @SpringBootTest 注释,当您需要 Spring Boot 功能时,可以将其用作标准 spring-test @ContextConfiguration 注释的替代品。注释通过 SpringApplication 创建测试中使用的 ApplicationContext 来工作。 Spring TestContext 框架将应用程序上下文存储在静态缓存中。这意味着上下文实际上存储在静态变量中。换句话说,如果测试在不同的进程中执行,静态缓存将在每次测试执行之间被清除,这将有效地禁用缓存机制。 要从缓存机制中受益,所有测试都必须在同一进程或测试套件中运行。这可以通过在 IDE 中作为一个组执行所有测试来实现

来自 Spring 测试文档:

默认情况下,一旦加载,配置的 ApplicationContext 会被重复用于每个测试。因此,每个测试套件只产生一次设置成本,随后的测试执行速度要快得多。在这种情况下,术语测试套件意味着所有测试都在同一个 JVM 中运行

检查这个网址:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#testcontext-ctx-management-caching http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#testing-ctx-management

要点:

@SpringBootTest注释每个单元测试

在您的主 @SpringBootApplication 类中加载所有 bean 和必要的配置类

重要提示:运行 JUnit 套件,而不是单个 JUnit 测试。在 IDE 中作为一个组执行所有测试。

【讨论】:

以上是关于通过所有 SpringBootTests 使用一个 Spring Boot 上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何为不同的应用程序运行相同的 SpringBootTests

如何在 Spring Boot Tests 中设置 servlet 上下文路径?

春季启动测试 - 找不到测试属性

如何通过使用alpine js单击一个复选框来选中和取消选中所有复选框

通过 CLGeocoder 的方法查找一个区域中的所有位置

通过LINQ将函数应用于集合的所有元素[重复]