Как добавить режим = 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, но он не работал должным образом.