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