如何在集成测试中禁用自动配置?

时间:2021-04-25 02:58:50

标签: spring spring-boot

我正在尝试:

@SpringBootTest(
  webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
)

@EnableAutoConfiguration(
  exclude = [
    ReactiveOAuth2ClientAutoConfiguration::class,
    ReactiveOAuth2ResourceServerAutoConfiguration::class,
  ]
)
@ActiveProfiles("testcontainers")
internal class RecordIntegrationTest {
  @Test
  fun contextLoads() {}
}

在 application.yml 中使用 testcontainers 配置文件:

spring:
  config.activate.on-profile: testcontainers
  r2dbc.url: r2dbc:tc:postgresql:///databasename?TC_IMAGE_TAG=13.2
  flyway:
    enabled: false

然后它尝试创建存储库两次(可能还有其他 bean):

java.lang.IllegalStateException: Failed to load ApplicationContext
...
Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'recordRepository' defined in com.example.RecordRepository defined in @EnableR2dbcRepositories declared on R2dbcRepositoriesAutoConfigureRegistrar.EnableR2dbcRepositoriesConfiguration: Cannot register bean definition [Root bean: class [org.springframework.data.r2dbc.repository.support.R2dbcRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in com.example.RecordRepository defined in @EnableR2dbcRepositories declared on R2dbcRepositoriesAutoConfigureRegistrar.EnableR2dbcRepositoriesConfiguration] for bean 'recordRepository': There is already [Root bean: class [org.springframework.data.r2dbc.repository.support.R2dbcRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in com.example.RecordRepository defined in @EnableR2dbcRepositories declared on R2dbcRepositoriesAutoConfigureRegistrar.EnableR2dbcRepositoriesConfiguration] bound.

更新

当我把它移到根包时发现测试运行良好

src/test/kotlin/com/example/backend

但是当我把它放在包里时它失败了

`src/test/kotlin/com/example/backend/subfolder`

更新 2

我发现如果在 src/main/kotlin 下定义的存储库与集成测试在同一个包中,则会出现异常。

例如:

data class X(@Id id: Long? = null)
// src/main/kotlin/com/example/x/XRepository.kt
interface XRepository : CoroutineCrudRepository<X, Long> {}

此测试失败,出现上述异常:

// src/test/kotlin/com/example/x/XIntegrationTest.kt
@SpringBootTest(classes = [BackendApplication::class])
@EnableAutoConfiguration(
  exclude = [
    ReactiveOAuth2ClientAutoConfiguration::class,
    ReactiveOAuth2ResourceServerAutoConfiguration::class,
  ]
)
@ActiveProfiles("testcontainers")
internal class XIntegrationTest {

  @Test
  fun contextLoads() {
  }
}

删除存储库或将集成测试移动到不同的包工作正常。

2 个答案:

答案 0 :(得分:0)

EnableR2dbcRepositories 使用的排除块中包含 DataSourceAutoConfiguration,这会在启动 Repositories 使用的集成测试时禁用数据源检查,或者您可以配置 datasource 来解决此问题.

问题主要是由于存储库所需的数据源不可用

答案 1 :(得分:0)

在您的 src/main/java 中的某处,您有一个带有注释 @EnableAutoConfiguration 的类。 这是您要从测试中排除的类,当您在测试包的其他类中定义了自己的 @EnableAutoConfiguration 时。