在我的项目,我们有我们的所有测试一个超类。这是一个类的签名
@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,当一些豆类结婚登记了两次,该异常上升。从这个链接:
据说:
一个ApplicationContext可以通过的是,用于加载配置参数的组合来唯一地标识。因此,配置参数的唯一组合被用于产生在其下上下文高速缓存的密钥。TestContext框架采用以下配置参数来构建上下文缓存键
我明白,但是,我不知道我怎样才能做到这一点?我的目标是运行所有我在同一JVM测试和重用与每个测试的上下文。
编辑于星期四2月22日
事情我想:
真的禁用JMX不应该帮助,因为错误时抛出是围绕EnvironmentManager,这是春天的云。
我找到了答案,我的问题。这里是很好的解释:
https://github.com/spring-projects/spring-boot/issues/7174
基本上,如果你运行一系列测试,只要他们中的一个被启动,如果它使用注释@MockBean这将迫使春天重新加载上下文。
奖励:你会看到同样的行为,如果你的测试使用org.mockito.Mock。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句