如何在Spring Boot 1.4.1中为@DataJpaTest添加mode=mysql到嵌入式H2 DB?

问题描述 投票:0回答:6

在执行 junit 测试时使用 schema.sql 文件创建 sql 模式时遇到一些问题,而该模式包含 mysql 特定表达式。我必须将

mode=mysql
添加到 H2 url。

例如这样的事情:

jdbc:h2:mem:testd;MODE=MYSQL 

但是Spring boot会自动使用枚举中定义的url org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection 及其 url

jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
.

我已经尝试过类似的方法来让它工作,但是 spring 没有从我的 test-application.properties 中获取

spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL
。我的 test-application.properties 中的所有其他设置均已成功读取。

如果我让 spring/hibernate 在我的实体中使用 javax.persistence 注释创建模式(没有 schema.sql 文件),一切都会正常。

有没有简单的方法来添加模式?

java mysql hibernate spring-boot h2
6个回答
31
投票

设置

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL

在 application-test.properties 中,加上

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ActiveProfiles("test")

在测试课上


21
投票

我也遇到了同样的问题。运行测试时它不会获取 url。我正在使用 Flyway 来管理我的脚本。通过遵循以下几个步骤,我能够使所有这些一起工作。

在 src/test/resources/db/migration 中创建了一个

V1_init.sql
脚本,使其成为 Flyway 运行的第一个脚本。

SET MODE MYSQL; /* another h2 way to set mode */

CREATE SCHEMA IF NOT EXISTS "public"; /* required due to issue with flyway --> https://stackoverflow.com/a/19115417/1224584*/

更新了

application-test.yaml
以包含架构名称 public:

flyway:
  schemas: public

确保测试指定了配置文件:

@ActiveProfiles("test")


6
投票

我已经尝试过类似的方法来使其工作,但 spring 没有从我的 test-application.properties 中获取 spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL

您是否尝试附加此参数而不是重写现有参数?

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL

我的 test-application.properties 中的所有其他设置均已成功读取。

我认为该文件应该命名为

application-test.properties


3
投票

您需要在 h2 上设置

MYSQL
模式并禁用替换嵌入式数据库的数据源 url:

修改

application-test.yaml

spring:
  datasource:
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;MODE=MYSQL  
  test:
    database:
      replace: NONE

2
投票

我能够使用此配置运行它:

# for integration tests use H2 in MySQL mode
spring.datasource.url=jdbc:h2:mem:testdb;DATABASE_TO_LOWER=TRUE;MODE=MySQL;
spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect

这里的主要技巧是强制 Hibernate 为 MariaDB 方言生成 SQL 脚本,否则 Hibernate 会尝试使用 H2 方言,而 H2 已经在等待类似 MySQL 的命令。

我还尝试对 MariaDB 10.3 使用更新鲜的

MariaDB103Dialect
,但它无法正常工作。


0
投票

问题是区分大小写。我能够以相同的方式运行 liquibase init ,但在 jpa 数据源上失败,因为找不到架构。如果您使用

MODE=MYSQL
,架构是以全大写形式创建的,因此为了在测试中重用相同的 h2 (由 liquibase 初始化),那么您需要确保架构按照定义是全大写的。

spring.application.name=WEB TEST
spring.jpa.show-sql=true
spring.liquibase.enabled=true
app.db.name=TEST_DB
spring.test.database.replace=none
spring.datasource.url=jdbc:h2:mem:${app.db.name};DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS ${app.db.name};MODE=MYSQL
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
logging.level.org.h2=DEBUG
© www.soinside.com 2019 - 2024. All rights reserved.