在我的项目中,我们的所有测试都有一个超类。这是该类的签名
@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是我们的主类,SomeConfiguration.class只适用于某些@Bean和其他东西,没什么特别的。
我使用gradle,为了运行我的测试,我做了:
./gradlew :my-project:test
我的问题是:
由于多个上下文已初始化,因此上下文似乎相互重叠。我知道这是因为其中一个症状就是这个例外:
Caused by: org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [org.springframework.cloud.context.environment.EnvironmentManager@36408d9e] with key 'environmentManager'; nested exception is javax.management.InstanceAlreadyExistsException: RedeemAway:name=environmentManager,type=EnvironmentManager
即使我不关心正在加载的多个上下文,我的印象是,当测试结束时,下一个测试会在前一个上一个测试结束之前获得新的上下文。我说这是因为上面的例外重叠。
由于所有测试共享相同的JVM,因此当某些bean两次注册时,该异常会上升。从这个链接:
据说:
ApplicationContext可以通过组合唯一地标识 用于加载它的配置参数。因此, 配置参数的唯一组合用于生成a 缓存上下文的键。 TestContext框架使用 以下配置参数来构建上下文缓存键
我理解,但是,我想知道如何实现这一目标?我的目标是在同一个JVM上运行我的所有测试,并在每次测试时重用上下文。
2月22日星期四编辑
我尝试的事情:
真正禁用JMX应该没有帮助,因为这是围绕来自Spring Cloud的EnvironmentManager。
答案 0 :(得分:2)
我找到了问题的答案。这里有很好的解释:
https://github.com/spring-projects/spring-boot/issues/7174
基本上,如果你运行一堆测试,只要其中一个测试开始,如果它使用注释@MockBean,它将强制Spring重新加载上下文。
奖励:如果您的测试使用org.mockito.Mock,您将看到相同的行为。