【问题标题】:Reset Spring-Boot During Integration Tests在集成测试期间重置 Spring-Boot
【发布时间】:2017-10-29 17:31:21
【问题描述】:

我想我想在这里找到一个极端案例。在我当前的项目中,大约有 20 个集成测试。一项新的集成测试需要@EnableAsync 才能进行测试:

@RunWith(SpringRunner.class)
@EnableAsync
@SpringBootTest(webEnvironment = WebEnvironment.NONE)
public class MyITest {
  :
}

单独运行时,此测试运行良好。

考虑到 Maven 和 Eclipse 在一个项目中执行测试,并且知道该环境只创建一次并为所有集成测试重用(或软重置),所以这个集成测试首先运行有点要求。然而,(几乎?)从来都不是这样。

因此,这个集成测试(几乎?)总是失败。一种明显的解决方案是将@EnableAsync 添加到所有集成测试中。但是,我敢打赌,一旦有人添加另一个集成测试并忘记了这个要求,它就会被打破。

我正在寻找一种方法来强制SpringRunner 完全重置上下文并真正从头开始,同时查看@EnableAsync。理想情况下,这种方式包括标记SpringRunner 在测试后也必须重置上下文(即删除@EnableAsync)。这样,任何执行顺序都可以确保只有一个测试具有@EnableAsync

有没有办法做到这一点?或者我可以通过@Before/@After 方法中的代码手动打开/关闭异步内容吗?

【问题讨论】:

标签: spring-boot integration-testing reset


【解决方案1】:

看看DirtiesContext

不确定这是否是您要查找的内容。

可能重复:How do you reset Spring JUnit application context after a test class dirties it?

【讨论】:

  • 谢谢,提供信息,我不知道那个注释。但是,因为它现在正在运行,所以我不会尝试这个。对不起...
【解决方案2】:

哇,我想我是偶然发现的……我现在拥有的:

@RunWith(SpringRunner.class)
@EnableAsync
@SpringBootTest(webEnvironment = WebEnvironment.NONE, classes = {
    ClassWithAnAutowiredAsyncDependency.class // <=== difference!!! ===>
})
public class MyITest {
:
  @Autowired
  private ClassWithAnAutowiredAsyncDependency mine;
:
}

似乎给定的类被重置(特别是?),或者至少自动装配再次发生在那里或其他什么。我无法解释它有什么不同。

我确信这个集成测试不是第一个运行的集成测试,而且异步位似乎仍然存在。

好吧,测试是绿色的,它可以工作......

【讨论】:

  • 虽然这是一个老帖子,你知道为什么添加这个类会重置上下文吗?
  • @AleksandarT 不,抱歉。
  • 因为我的问题是相反的,当使用故障安全插件启动 mvn verify 命令时,我的 spring 上下文在测试中重置,并且测试需要 1 小时才能运行。我想改变它,Spring Context 只启动一次
猜你喜欢
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 2015-08-23
  • 1970-01-01
相关资源
最近更新 更多