【发布时间】:2021-06-27 13:00:03
【问题描述】:
我们在 Netty 上运行了 2 个 Spring Boot 集成测试。
我们使用 gradle 使用标志并行运行测试:org.gradle.parallel=true
测试 1:@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 创建 org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext@3736a122
测试 2:@SpringBootTest(webEnvironment = WebEnvironment.MOCK) 创建 org.springframework.boot.web.reactive.context.GenericReactiveWebApplicationContext@45fa13a7
创建了两个应用程序上下文,其中一个应用程序上下文随机注入到生产代码中,因此我们有两组 bean。
使用了以下依赖:
dependencySet(组:'org.springframework',版本:'5.3.5')
dependencySet(组:'org.springframework.boot',版本:'2.4.4')
行为是否正常,因为在一种情况下:使用了模拟网络环境,而在另一个真实的网络环境中?
【问题讨论】:
-
正如预期的那样,它们有 2 个不同的配置,因此有 2 个实例。如果您使用经典单例来保存
ApplicationContext,您将遇到问题。虽然测试并行运行,但它们在同一个 JVM 中运行,因此静态字段只能存在 1 个值,基本上最后一个启动的值将获胜。修复不要使用这样的类。 -
我们没有任何静态字段,或者您的意思是单格子注入?当我们将 mock 更改为 webEnvironment = WebEnvironment.RANDOM_PORT 时,会创建一个应用程序上下文并在任何地方使用。
-
正确,因为它是相同的配置。不,我的意思是静态字段。但我怀疑你的代码中有
ApplicationContextHolder之类的东西。至少从您的描述来看,否则您的问题/问题不清楚。是否创建了 2 个上下文是正确的。 -
@Inject private ApplicationContext applicationContext;
-
我还是不明白你的问题。这是一个问题吗?不是吗?你的问题是关于这两种情况吗?或者...所以再次是的,您有 2 个上下文,因此您有 2 组所有 bean,这是可以预期的。
标签: java spring spring-boot spring-boot-test