在执行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文件),一切正常。
是否有一种简单的方法来添加模式?
答案 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