Spring 启动测试:为每个测试加载上下文?

Spring boot test: context loaded for every test?

在我的项目中,我们为所有测试提供了超级 class。这是class

的签名
@RunWith(SpringRunner.class)
@SpringBootTest(value = {"management.port=0"}, classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles({"localhost", "test"})
@ContextConfiguration(classes = {Application.class, SomeConfiguration.class})
@Ignore
public abstract class AIntegrationTest {

其中 Application.class 是我们的主要 class,而 SomeConfiguration.class 它只是一些 @Bean 和其他东西,没什么特别的。

我使用 gradle,对于 运行我的测试我这样做:

./gradlew :my-project:test

我的问题是:

由于所有测试共享同一个 JVM,当某些 bean 被注册两次时,该异常就会出现。来自这个link:

Context caching

据说:

An ApplicationContext can be uniquely identified by the combination of configuration parameters that is used to load it. Consequently, the unique combination of configuration parameters is used to generate a key under which the context is cached. The TestContext framework uses the following configuration parameters to build the context cache key

我明白了,但是,我想知道我怎样才能做到这一点?我的目标是 运行 我的所有测试都在同一个 JVM 上,并在每个测试中重用上下文。

EDIT on Thu Feb 22

我尝试过的事情:

真正禁用 JMX 应该没有帮助,因为异常是围绕来自 Spring Cloud 的 EnvironmentManager。

我找到了问题的答案。这里有很好的解释:

https://github.com/spring-projects/spring-boot/issues/7174

基本上,如果你 运行 一堆测试,一旦其中一个开始,如果它使用注释 @MockBean 它将强制 Spring 重新加载上下文.

奖励:如果您的测试使用 org.mockito.Mock.

,您将看到相同的行为