web-dev-qa-db-fra.com

Comment ajouter le mode = mysql à la base de données H2 intégrée dans Spring Boot 1.4.1 pour @DataJpaTest?

J'ai des problèmes avec l'utilisation d'un fichier schema.sql pour créer mon schéma sql lors de l'exécution d'un test junit alors que ce schéma contient une expression spécifique à mysql. Je dois ajouter le mode=mysql à l'URL H2.

Par exemple quelque chose comme ceci: jdbc:h2:mem:testd;MODE=MYSQL

Mais Spring Boot utilise automatiquement l'URL définie dans l'énumération org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection avec son URL

jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE.

J'ai essayé des approches similaires pour que cela fonctionne, mais le printemps ne prend pas le spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL de mon test-application.properties. Tous les autres paramètres de mes test-application.properties ont été lus avec succès.

Si je laisse spring/hibernate créer le schéma (sans le fichier schema.sql) avec les annotations javax.persistence dans mes entités, tout fonctionne bien.

Existe-t-il un moyen simple d'ajouter un mode?

14
Marco

J'avais ce même problème. Il ne prendrait pas l'URL lors de l'exécution des tests. J'utilise flyway pour gérer mes scripts. J'ai pu obtenir tous ces éléments ensemble en suivant ces quelques étapes.

Création d'un script V1_init.sql Dans src/test/resources/db/migration afin qu'il soit le premier script exécuté par 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 Mis à jour pour inclure le nom du schéma public:

flyway:
  schemas: public

Assurez-vous que le test a spécifié le profil: @ActiveProfiles("test")

13
anztenney

Ensemble

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

dans application-test.properties, plus

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

sur la classe de test

7
Evgeny Batalov

J'ai essayé des approches similaires pour que cela fonctionne, mais le printemps ne prend pas le ressort.datasource.url = jdbc: h2: mem: testdb; MODE = MYSQL de mon test-application.properties

Avez-vous essayé d'ajouter ces paramètres au lieu de réécrire les paramètres existants?

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

Tous les autres paramètres de mes test-application.properties ont été lus avec succès.

Je pensais que ce fichier devrait être nommé application-test.properties.

2
Slava Semushin

J'ai pu l'exécuter avec cette config:

# 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

L'astuce principale ici est de forcer Hibernate à générer des scripts SQL pour le dialecte MariaDB car sinon Hibernate essaie d'utiliser le dialecte H2 alors que H2 attend déjà des commandes de type MySQL.

J'ai aussi essayé d'utiliser plus de fraîcheur MariaDB103Dialect pour MariaDB 10.3 mais cela ne fonctionne pas correctement.

0
stokito