You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建使用Liquibase初始化并结合Testcontainers的DataR2dbcTest

解决R2DBC + Testcontainers + Liquibase测试不生效的问题

问题根源

你当前的写法不生效主要有两个原因:

  1. @DataR2dbcTest是Spring的切片测试注解,默认会排除JDBC相关的自动配置(比如DataSourceAutoConfiguration),而Liquibase依赖JDBC数据源执行数据库变更,就算手动引入LiquibaseAutoConfiguration,也缺少必要的DataSource Bean支撑。
  2. 手动添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:23:12