如何为所有测试初始化​​Spring applicationContext一次

我有一组需要弹簧上下文的测试。

为了快速执行测试,我想确保Spring上下文只被初始化一次,然后所有的测试应该针对这个上下文运行,然后它应该关闭。

我已经尝试过以下方法:

  1. 使用@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(MyAnnotatedConfig.class)初始化spring上下文
  2. 使用@RunWith(SpringJUnit4ClassRunner.class)@TestExecutionListeners({MyTestExecutionListener.class})和一个手写的测试执行监听器来初始化spring上下文并将其注入具体的测试类
  3. 在基类和静态字段中使用@BeforeClass侦听器来存储spring上下文,并使用@AfterClass来关闭

使用这三种方法,弹簧上下文似乎不止一次初始化,这需要花费很多时间。 似乎JUnit在运行测试时卸载了类,因此静态字段的内容有时会丢失。

有没有办法确保弹簧上下文只初始化一次?

为了快速执行测试,我想确保Spring上下文只被初始化一次,然后所有的测试应该针对这个上下文运行,然后它应该关闭。

我不想问明显,但……

您是否阅读过Spring参考手册的测试章节 ?

具体来说,这些部分解释了发生了什么:

  • 上下文管理和缓存
  • 上下文缓存

Soooo,TestContext框架当然支持在测试套件中跨测试进行缓存,我应该知道,因为我写了它。 ;)

现在,为什么缓存不适合您,我只能假设您已经为每个测试配置了构建框架(或者您在IDE中单独和手动运行测试)。 以上是上一个链接的摘录,可能会帮助您:

测试套件和分叉流程

Spring TestContext框架将应用程序上下文存储在静态缓存中。 这意味着上下文实际上存储在静态变量中。 换句话说,如果测试在单独的进程中执行,则静态高速缓存将在每次测试执行之间被清除,这将有效地禁用高速缓存机制。

要从缓存机制中受益,所有测试必须在同一进程或测试套件中运行。 这可以通过在IDE中作为一个组执行所有测试来实现。 类似地,当使用诸如Ant,Maven或Gradle之类的构建框架执行测试时,确保构建框架不在测试之间进行分配是很重要的。 例如,如果Maven Surefire插件的forkMode设置为always或pertest,则TestContext框架将无法在测试类之间缓存应用程序上下文,因此构建过程将显着减慢运行速度。

如果在考虑上述问题后仍然遇到问题,请考虑提交一个certificate您问题的项目 。

干杯,

山姆