web-dev-qa-db-fra.com

Spring Boot. La base de données intégrée @DataJpaTest H2 crée un schéma

J'ai quelques entités dans ma couche de données stockées dans un schéma particulier. Par exemple:

@Entity
@Table(name = "FOO", schema = "DUMMY")
public class Foo {}

J'essaie de configurer la base de données intégrée H2 pour les tests d'intégration de ma couche de données. J'utilise l'annotation @DataJpaTest Pour mes tests afin de configurer automatiquement la base de données intégrée H2. Cependant, la création de tables échoue car le schéma DUMMY n'est pas créé lors de l'initialisation de la base de données.

Des idées sur la façon de créer un schéma avant la création de tables dans des cas de test?

J'ai essayé d'utiliser @Sql (instructions = "CREATE SCHEMA IF NOT EXISTS DUMMY") mais j'ai échoué.

J'ai également essayé de définir spring.datasource.url = jdbc:h2:mem:test;INIT=CREATE SCHEMA IF NOT EXISTS DUMMY Dans mon fichier test.properties Avec TestPropertySource("classpath:test.properties"), mais cela n'a pas fonctionné aussi.

17
StasKolodyuk

J'ai eu le même problème, j'ai réussi à le résoudre en créant schema.sql (dans le dossier des ressources) avec le contenu

CREATE SCHEMA IF NOT EXISTS <yourschema>

La documentation peut être trouvée ici mais à mon humble avis, le manque d'exemples réels la rend très complexe. Attention: ce script est également exécuté dans l'environnement normal (pas de test).

Pas obligatoire, mais bonne pratique, ajoutez la dépendance h2 uniquement dans la portée du test

<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
   <scope>test</scope>
</dependency>
18
David Canós

Après quelques heures de lutte, j'ai trouvé une solution.

Vous pouvez définir spring.jpa.properties.hibernate.default_schema = DUMMY Dans votre application.properties.

Ensuite, définissez spring.jpa.properties.hibernate.default_schema = Dans votre test.properties Et utilisez-le avec @TestPropertySource("classpath:test.properties")

Ainsi, de cette manière, le schéma DUMMY ne sera pas créé et les entités seront créées dans le schéma par défaut.

2
StasKolodyuk