Как добавить режим = mysql в встроенную H2 DB в Spring Boot 1.4.1 для @DataJpaTest?
У меня есть некоторые проблемы с использованием файла schema.sql для создания моей схемы sql при выполнении теста junit, в то время как эта схема содержит специфическое выражение mysql. Я должен добавить mode=mysql
к URL-адресу H2.
Например, что-то вроде этого: jdbc:h2:mem:testd;MODE=MYSQL
Но Spring boot автоматически использует url, указанный в enum org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection с его URL-адресом
jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
.
Я попробовал аналогичные подходы, чтобы заставить это работать, но весна не принимает spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL
из моего test-application.properties. Все остальные настройки из моего test-application.properties были успешно прочитаны.
Если я позволю spring/hibernate создать схему (без файла schema.sql) с аннотациями javax.persistence в моих сущностях, все работает нормально.
Есть ли простой способ добавить режим?
Ответы
Ответ 1
У меня была такая же проблема. При запуске тестов он не забирал URL-адрес. Я использую flyway для управления своими сценариями. Я смог собрать все эти работы, выполнив следующие шаги.
Создал сценарий V1_init.sql
в src/test/resources/db/migration, так что это первый скрипт, выполняемый пролетным путем.
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")
Ответ 2
Задавать
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")
на тестовом классе
Ответ 3
Я попробовал аналогичные подходы, чтобы заставить это работать, но весна не принимает spring.datasource.url = jdbc: h2: mem: testdb; MODE = MYSQL из моего 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
.
Ответ 4
Я смог запустить его с этим конфигом:
# 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 генерировать сценарии SQL для диалекта MariaDB, потому что в противном случае Hibernate пытается использовать диалект H2, в то время как H2 уже ожидает MySQL-подобные команды.
Также я попытался использовать более свежий MariaDB103Dialect
для MariaDB 10.3, но он не работал должным образом.