如何在测试之间关闭应用程序上下文

Ser*_*kin 5 applicationcontext spring-boot spring-boot-test

我有 3 组测试:单元、集成、验收。

  • 后两组启动 ApplicationContext:“集成”最少,“接受”完整。
  • 两个应用程序上下文都注册队列订阅者。
  • 在整个测试运行结束时注销应用程序上下文 ( @RunWith(SpringRunner.class))

当我运行“所有测试”时,会启动 2 个不同的应用程序上下文,并且我有重复的队列订阅者。

我知道此订阅者重复的以下解决方法:

  • 永远不要同时运行集成和验收测试
  • 将“验收”应用程序上下文用于“集成”测试。缺点:试运行需要更长的时间。
  • 添加静态注册表并手动添加/删除侦听器。缺点:过于复杂且容易忘记

在一组测试之后,是否有任何方便的方法来卸载应用程序上下文?

基于ndrone答案的更新

  • @DirtiesContext 是绝配
  • 另一种选择是将缓存的 ApplicationContexts 计数限制为 1 spring.test.context.cache.maxSize=1

使用脏上下文测试超类示例

    @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
    @TestExecutionListeners({FlywayTestExecutionListener.class, DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class})
    @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
    public abstract class AcceptanceTest {}
Run Code Online (Sandbox Code Playgroud)