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?
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")
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
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
.
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.