运行 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 的原因是啥