运行 spring 使用 gradle 并行启动测试创建两个应用程序上下文

Running spring boot tests parallelly using gradle create two application contexts

我们有 2 个 spring 引导集成测试 运行nig on Netty。

我们使用 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')

依赖集(组:'org.springframework.boot',版本:'2.4.4')

这是正常的行为,因为在一种情况下:使用了模拟网络环境,而在另一个真实网络环境中?

在使用 Spring 测试上下文框架时,它将执行 context caching。当使用相同的上下文配置时,它将重新使用现有的上下文(或者如果不存在则启动一个)。如果有新的配置组合(在您的情况下,运行时有所不同,即启动真实服务器或使用模拟环境),它将启动一个新的。

来自上述参考指南:

An ApplicationContext can be uniquely identified by the combination of configuration parameters that are used to load it. Consequently, the unique combination of configuration parameters is used to generate a key under which the context is cached. The TestContext framework uses the following configuration parameters to build the context cache key:

  • locations (from @ContextConfiguration)
  • classes (from @ContextConfiguration)
  • contextInitializerClasses (from @ContextConfiguration)
  • contextCustomizers (from ContextCustomizerFactory) – this includes @DynamicPropertySource methods as well as various features from Spring Boot’s testing support such as @MockBean and @SpyBean.
  • contextLoader (from @ContextConfiguration)
  • parent (from @ContextHierarchy)
  • activeProfiles (from @ActiveProfiles)
  • propertySourceLocations (from @TestPropertySource)
  • propertySourceProperties (from @TestPropertySource)
  • resourceBasePath (from @WebAppConfiguration)

在这种情况下,由于运行时不同,contextCustomizers存在差异,因此没有可用的缓存上下文,将启动一个新的。