弹簧启动测试:为每个测试加载上下文



在我的项目中,我们有一个超级类,用于所有测试。这是该类的签名

@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 {

where 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,因此当一些豆子注册两次时,该例外会增加。从此链接:

上下文缓存

说:

可以通过组合来唯一识别应用程序context 用于加载它的配置参数。因此, 配置参数的唯一组合用于生成一个 关键在上下文缓存。TestContext框架使用 以下配置参数以构建上下文缓存键

我明白这一点,但是,我想知道我该如何实现?我的目标是通过同一JVM进行所有测试,并在每个测试中重复使用上下文。

在2月22日星期四编辑

我尝试的东西:

  • spring.jmx.enabled:false
  • spring.jmx.default-domain:Some-value

真的禁用JMX无济于事,因为excetion在环境管理器附近,该emoveruct Manager来自春季云。

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

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

基本上,如果您进行了一堆测试,则一旦开始使用一个测试,如果它使用注释@MockBean,它将迫使Spring重新加载上下文。

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

,您将看到相同的行为

最新更新