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

Bas*_*igt 1 java spring spring-test junit4

我有一组基于Spring的测试。

为了快速执行测试,我想确保Spring上下文仅初始化一次,然后所有测试都应针对该上下文运行,然后将其关闭。

我已经尝试了以下方法:

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

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

有没有办法确保spring上下文仅初始化一次?

Sam*_*nen 6

为了快速执行测试,我想确保Spring上下文仅初始化一次,然后所有测试都应针对该上下文运行,然后将其关闭。

我不想问明显的问题,但是...

您是否已阅读《弹簧参考手册》的“ 测试”一章

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

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

现在,关于为什么缓存对您不起作用的原因,我只能假定您已将构建框架配置为针对每个测试派生(或者您正在IDE中单独并手动运行测试)。这是上面最后一个链接的摘录,可能会对您有所帮助:

测试套件和分叉过程

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

为了从缓存机制中受益,所有测试必须在同一进程或测试套件中运行。这可以通过在IDE中以组的形式执行所有测试来实现。同样,在使用Ant,Maven或Gradle之类的构建框架执行测试时,重要的是要确保构建框架不会在测试之间分叉。例如,如果将Maven Surefire插件的forkMode设置为always或pertest,则TestContext框架将无法在测试类之间缓存应用程序上下文,结果,构建过程将运行得很慢。

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

干杯,

山姆