我正在尝试:
@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() {
}
}
删除存储库或将集成测试移动到不同的包工作正常。
答案 0 :(得分:0)
在 EnableR2dbcRepositories
使用的排除块中包含 DataSourceAutoConfiguration,这会在启动 Repositories
使用的集成测试时禁用数据源检查,或者您可以配置 datasource
来解决此问题.
问题主要是由于存储库所需的数据源不可用
答案 1 :(得分:0)
在您的 src/main/java
中的某处,您有一个带有注释 @EnableAutoConfiguration
的类。 这是您要从测试中排除的类,当您在测试包的其他类中定义了自己的 @EnableAutoConfiguration
时。