如何创建使用Liquibase初始化并结合Testcontainers的DataR2dbcTest
解决R2DBC + Testcontainers + Liquibase测试不生效的问题
问题根源
你当前的写法不生效主要有两个原因:
@DataR2dbcTest是Spring的切片测试注解,默认会排除JDBC相关的自动配置(比如DataSourceAutoConfiguration),而Liquibase依赖JDBC数据源执行数据库变更,就算手动引入LiquibaseAutoConfiguration,也缺少必要的DataSourceBean支撑。- 手动添加
LiquibaseAutoConfiguration无法触发完整的配置链路,缺少Liquibase初始化所需的上下文参数。
修复方案
直接调整测试注解和配置,让Liquibase能正确拿到Testcontainers提供的JDBC数据源:
@DataR2dbcTest( properties = [ "spring.datasource.url=jdbc:tc:mysql://mysql/gateway?TC_IMAGE_TAG=8", "spring.r2dbc.url=r2dbc:tc:mysql://mysql/gateway?TC_IMAGE_TAG=8", // 替换成你实际的Liquibase changelog路径 "spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.yaml" ] ) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @AutoConfigureLiquibase // 自动配置Liquibase核心组件 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) // 保留Testcontainers的JDBC数据源 class ApplicationR2dbcTests { @Autowired lateinit var applicationContext: ApplicationContext // 你的测试方法... }
关键说明
@AutoConfigureLiquibase:替代手动引入LiquibaseAutoConfiguration,会自动加载Liquibase的完整配置,包括绑定JDBC数据源。@AutoConfigureTestDatabase(replace = ...NONE):禁止Spring用内存数据库替换你配置的Testcontainers数据源,确保Liquibase能连接到实际启动的MySQL容器。- 必须指定
spring.liquibase.change-log:告诉Liquibase要执行的变更文件路径,否则它找不到执行入口。
额外注意事项
- 确保项目中引入了
liquibase-core和spring-boot-starter-jdbc依赖(Liquibase依赖JDBC)。 - Spring Boot 3.x默认启用Liquibase,2.x需要额外配置
spring.liquibase.enabled=true。
内容的提问来源于stack exchange,提问作者Archimedes Trajano
相关产品推荐
相关产品推荐

