【问题标题】:How can I initialize a Spring applicationContext just once for all tests如何为所有测试只初始化一次 Spring applicationContext
【发布时间】:2014-04-08 13:55:06
【问题描述】:

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

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

我已经尝试了以下方法:

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

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

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

【问题讨论】:

  • 使用test suite
  • @BoristheSpider 是的,这可能是一个选项,虽然它不是我最喜欢的,因为它需要为我们编写的每个新测试额外的配置开销
  • 您可以将@RunWith@TestExecutionListeners @ContextConfiguration 注释放在您的基类上,这样只会初始化上下文一次。
  • @Jamey 那是我试过的,对我没用:-(
  • 嗯,它绝对适合我。这正是我为我们的测试所做的……我想不出为什么那行不通。你用什么来运行测试?事实上,鲍里斯是正确的。我使用一个套件来运行我们的测试,所以我想这可以根据需要为我管理生命周期。 :)

标签: java spring junit4 spring-test


【解决方案1】:

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

我不想问显而易见的问题,但是......

你读过Testing chapter of the Spring Reference Manual吗?

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

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

现在至于为什么缓存对您不起作用,我只能假设您已将构建框架配置为为每个测试分叉(或者您在 IDE 中单独和手动运行测试)。以下是上面最后一个链接的摘录,可能会对您有所帮助:

测试套件和分叉进程

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

要从缓存机制中受益,所有测试都必须在 相同的流程或测试套件。这可以通过执行所有 在 IDE 中作为一个组进行测试。同样,当使用 构建框架,例如 Ant、Maven 或 Gradle 确保构建框架不会在测试之间分叉。为了 例如,如果 Maven Surefire 插件的 forkMode 设置为 always 或 pertest,TestContext 框架将无法缓存 测试类和构建过程之间的应用程序上下文将 结果运行速度明显变慢。

如果您在考虑上述情况后仍然遇到问题,请考虑 submitting a project 证明您的问题。

干杯,

山姆

【讨论】:

  • 谢谢山姆。提交一个演示项目当然是个好主意,因为这个问题似乎很难描述。我希望我能抽出时间来做这件事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多