弹簧启动测试:为每个测试加载上下文?
2022-09-03 02:07:01
在我的项目中,我们有一个用于所有测试的超类。这是该类的签名
@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注册两次时,该异常就会上升。从此链接:
据说:
应用程序上下文可以通过用于加载它的配置参数的组合来唯一标识。因此,配置参数的唯一组合用于生成缓存上下文的键。TestContext 框架使用以下配置参数来构建上下文缓存键
我理解这一点,但是,我想知道我该如何实现这一目标?我的目标是在同一个JVM上运行我的所有测试,并在每次测试中重用上下文。
编辑 星期四 2月 22
我尝试过的事情:
- spring.jmx.enabled: false
- spring.jmx.default-domain: some-value
真正禁用JMX应该无济于事,因为excpetion是围绕来自Spring Cloud的环境管理器。