如何为所有测试初始化Spring applicationContext一次
我有一组需要弹簧上下文的测试。
为了快速执行测试,我想确保Spring上下文只被初始化一次,然后所有的测试应该针对这个上下文运行,然后它应该关闭。
我已经尝试过以下方法:
- 使用
@RunWith(SpringJUnit4ClassRunner.class)
和@ContextConfiguration(MyAnnotatedConfig.class)
初始化spring上下文 - 使用
@RunWith(SpringJUnit4ClassRunner.class)
和@TestExecutionListeners({MyTestExecutionListener.class})
和一个手写的测试执行监听器来初始化spring上下文并将其注入具体的测试类 - 在基类和静态字段中使用
@BeforeClass
侦听器来存储spring上下文,并使用@AfterClass
来关闭
使用这三种方法,弹簧上下文似乎不止一次初始化,这需要花费很多时间。 似乎JUnit在运行测试时卸载了类,因此静态字段的内容有时会丢失。
有没有办法确保弹簧上下文只初始化一次?
为了快速执行测试,我想确保Spring上下文只被初始化一次,然后所有的测试应该针对这个上下文运行,然后它应该关闭。
我不想问明显,但……
您是否阅读过Spring参考手册的测试章节 ?
具体来说,这些部分解释了发生了什么:
- 上下文管理和缓存
- 上下文缓存
Soooo,TestContext框架当然支持在测试套件中跨测试进行缓存,我应该知道,因为我写了它。 ;)
现在,为什么缓存不适合您,我只能假设您已经为每个测试配置了构建框架(或者您在IDE中单独和手动运行测试)。 以上是上一个链接的摘录,可能会帮助您:
测试套件和分叉流程
Spring TestContext框架将应用程序上下文存储在静态缓存中。 这意味着上下文实际上存储在静态变量中。 换句话说,如果测试在单独的进程中执行,则静态高速缓存将在每次测试执行之间被清除,这将有效地禁用高速缓存机制。
要从缓存机制中受益,所有测试必须在同一进程或测试套件中运行。 这可以通过在IDE中作为一个组执行所有测试来实现。 类似地,当使用诸如Ant,Maven或Gradle之类的构建框架执行测试时,确保构建框架不在测试之间进行分配是很重要的。 例如,如果Maven Surefire插件的forkMode设置为always或pertest,则TestContext框架将无法在测试类之间缓存应用程序上下文,因此构建过程将显着减慢运行速度。
如果在考虑上述问题后仍然遇到问题,请考虑提交一个certificate您问题的项目 。
干杯,
山姆