运行 Spring Boot 集成测试时出现 Liquibase 问题

Posted

技术标签:

【中文标题】运行 Spring Boot 集成测试时出现 Liquibase 问题【英文标题】:Liquibase issue while running spring boot integration test 【发布时间】:2019-05-30 21:40:45 【问题描述】:

我正在尝试在创建 liqubase bean 并运行所有变更集的 Spring Boot 中运行集成测试。在 yaml 文件中的更改集下运行时出现错误。 spring boot 集成测试运行异常

   - changeSet:
        id: 2
        author: XXX
        changes:
        - sql:
            splitStatements: true
            sql: CREATE ROLE dba_user LOGIN PASSWORD 'dba_user';
            stripComments: true

例外是

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "CREATE ROLE DBA_USER LOGIN[*] PASSWORD 'dba_user' "; SQL statement:
    CREATE ROLE dba_user LOGIN PASSWORD 'dba_user' [42000-196]

为什么要添加 [*] 还是有其他问题?运行变更集以创建视图时遇到的相同异常。

【问题讨论】:

【参考方案1】:

您的测试是针对没有CREATE ROLE 功能的H2 数据库运行的。

顺便说一句,我认为通过 Liquibase 创建角色不是一个好主意。 Liquibase 旨在用于数据库模式/数据迁移,而不是用于创建数据库实例(数据库角色创建也属于该实例)。我建议在创建数据库实例时创建角色(无论是自动还是手动)。

【讨论】:

很确定 H2 数据库有 CREATE ROLE 功能 我明白了你的意思,但是我创建的具有特定功能(例如用于 postgres 但在 H2 中不可用)的视图呢?我也得到同样的视图错误。【参考方案2】:

如果您有与 H2 不兼容的 SQL 查询,您可以使用 testcontainers 将 PostgreSQL 与您的集成测试一起使用。它在后台运行 docker 容器以满足您在测试中的数据库需求,并且您可以查询容器化的 PostgreSQL。

【讨论】:

【参考方案3】:
preConditions:
        - onFail: MARK_RAN
        - not:
          - dbms:
              type: h2

我找到了一种跳过数据库特定脚本的方法。所以如果是h2就不会运行。

【讨论】:

以上是关于运行 Spring Boot 集成测试时出现 Liquibase 问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 集成测试无法访问 application.properties 文件

运行spring boot项目时出现SQLSyntaxErrorException

运行Spring Boot APP时出现Spring Boot问题

运行 Spring Boot cassandra 项目时出现异常

运行 jar 时出现 Spring Boot 错误,但在 IDE 中工作正常(spring-boot-starter-data-jpa)

使用 MockMvc 和 AutoConfigureMockMvc 测试 Spring Boot Web 应用程序时出现 LazyInitializationException 的原因是啥