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

1szpjjfi  于 5个月前  发布在  Mysql
关注(0)|答案(6)|浏览(56)

我在执行junit测试时,使用schema.sql文件创建sql模式时遇到了一些问题,而此模式包含mysql特定表达式。我必须将mode=mysql添加到H2 url。
例如:jdbc:h2:mem:testd;MODE=MYSQL
但是Sping Boot 会自动使用在枚举org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection中定义的url及其url
jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE的值。该值为
我已经尝试过类似的方法来实现这个功能,但是Spring并没有从我的www.example.com中获取spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL。test-application.properties
如果我让spring/hib在我的实体中创建带有javax.persistence注解的模式(不使用schema.sql文件),一切都可以正常工作。
有没有一种简单的方法来添加模式?

sq1bmfud

sq1bmfud1#

设置

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")


在测试课上

o4hqfura

o4hqfura2#

我也遇到了同样的问题。在运行测试时,它不会拾取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")

oaxa6hgo

oaxa6hgo3#

我已经尝试过类似的方法来让它工作,但是spring并不需要spring。test-application.properties
你有没有尝试附加这个参数而不是重写现有的参数?

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

字符串
已成功读取我的test-application.properties中的所有其他设置。
我认为这个文件应该命名为application-test.properties

50pmv0ei

50pmv0ei4#

您需要在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

字符串

kadbb459

kadbb4595#

我可以用这个配置运行它:

# 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,但它不能正常工作。

nbysray5

nbysray56#

问题是大小写敏感。我可以以同样的方式运行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

字符串

相关问题