通过所有 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 上下文路径?