重置 Spring - 在集成测试期间启动

Reset Spring-Boot During Integration Tests

我想我正在尝试让一个角落案例在这里工作。 在我当前的项目中,大约有 20 个集成测试。一项新的集成测试需要 @EnableAsync 才能使测试工作:

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

单独 运行 时,此测试工作正常。

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

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

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

有办法吗?或者我可以在 @Before/@After 方法中通过代码手动打开 on/off 异步内容吗?

看看DirtiesContext

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

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

哇,我想我只是无意中发现的......我现在拥有的是:

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

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

我确定这个集成测试不是第一个集成测试 运行 而且异步位似乎已经到位。

嗯,测试是绿色的,有效...