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

时间:2017-02-21 10:36:18

标签: java mysql hibernate spring-boot h2

在执行junit测试时,使用schema.sql文件创建我的sql架构时遇到一些问题,而此架构包含mysql特定表达式。我必须将mode=mysql添加到H2网址。

例如: jdbc:h2:mem:testd;MODE=MYSQL

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

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文件),一切正常。

是否有一种简单的方法来添加模式?

5 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:7)

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

在application-test.properties中,加上

cargo test

在测试课上

答案 2 :(得分:2)

  

我已经尝试过类似的方法来实现这一点,但是spring并没有采用spring.datasource.url = jdbc:h2:mem:testdb; MODE =我的test-application.properties中的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 :(得分:1)

我能够使用以下配置运行它:

# 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已经在等待MySQL之类的命令时使用H2方言。

我还尝试为MariaDB 10.3使用更多的新鲜MariaDB103Dialect,但是它不能正常工作。

答案 4 :(得分:1)

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