web-dev-qa-db-fra.com

Utiliser une base de données intégrée pour un test lors du démarrage de printanier

J'ai une application de démarrage de printemps, il a un couple de classes @Entity et des interfaces de dépôt @RepositoryRestResource pour eux. Maintenant, je veux écrire quelques tests, où je peux vérifier que je peux ajouter un nouvel enregistrement à ma base de données en utilisant ces référentiels, mais je ne veux pas utiliser ma base de données MySQL configurée pour cela, comme H2. Pour le moment, j'ai un fichier application.properties, qui ressemble à ceci:

spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=qwerty123

Question: Comment configurer mon application pour utiliser d'autres bases de données à des fins de test? Je n'ai pas de xml dans mon projet, tout est basé sur des annotations. J'ai essayé de définir la classe @Configuration avec @Bean pour créer DataSource, puis de l'utiliser avec l'annotation @ContextConfiguration sur la classe de test, mais cela indique que le contexte ne peut pas être chargé.

7
Leonid Bor

Si vous utilisez un projet Maven, vous pouvez ajouter un fichier application.properties à votre src/test/resources, avec par exemple le contenu suivant.

# Create DDL
spring.jpa.hibernate.ddl-auto=create

# H2 in local file system allowing other simultaneous connections
spring.datasource.url=jdbc:h2:~/test;AUTO_SERVER=TRUE

En outre, vous devez inclure H2 en tant que dépendance (pom.xml):

<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
   <version>1.4.193</version>
</dependency>
14
Boni García

Spring Boot fournit 2 annotations magiques relatives aux autoconfigs JPA pour les tests: @DataJpaTest et @AutoConfigureTestDatabase. Le javadoc indique:

Par défaut, les tests annotés avec @DataJpaTest utilisent un fichier .__ incorporé. base de données en mémoire (remplace toute source explicite ou habituellement configurée automatiquement DataSource). L'annotation @AutoConfigureTestDatabase peut être utilisée pour remplacer ces paramètres.

Si vous souhaitez charger la configuration complète de votre application, mais Si vous utilisez une base de données intégrée, vous devez considérer @SpringBootTest combiné avec @AutoConfigureTestDatabase plutôt que cette annotation.

Donc, la seule chose dont vous avez absolument besoin est une dépendance dans votre fichier pom:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>test</scope>
    </dependency>

C'est tout. Cependant, la spécification de démarrage du printemps présente également deux mises en garde utiles:

Vous n'avez pas besoin de fournir d'URL de connexion. Vous devez seulement inclure un créer une dépendance à la base de données incorporée que vous souhaitez utiliser . Si vous utilisez cette fonctionnalité dans vos tests, vous remarquerez peut-être que le La même base de données est réutilisée par toute votre suite de tests, quel que soit le fichier nombre de contextes d'application que vous utilisez. Si vous voulez vous assurer que que chaque contexte possède une base de données intégrée distincte, vous devez définir spring.datasource.generate-unique-name to true.

Et un autre:

Si, pour une raison quelconque, vous configurez l'URL de connexion pour un fichier base de données intégrée, veillez à ce que la base de données automatique l'arrêt est désactivé. Si vous utilisez H2, vous devriez utiliser DB_CLOSE_ON_EXIT = FALSE pour le faire. Si vous utilisez HSQLDB, vous devez vous assurer que que shutdown = true n'est pas utilisé. Désactivation de la base de données automatique shutdown permet à Spring Boot de contrôler la fermeture de la base de données, par conséquent en veillant à ce que cela se produise une fois que l'accès à la base de données n'est plus nécessaire.

C'est presque tout ce que vous devez savoir sur Spring Boot et les bases de données intégrées. Je ne vois absolument aucune raison d'utiliser l'étendue de la dépendance autre que test, à moins de configurer intentionnellement une base de données intégrée pour l'exécution de votre application. Croyez-le ou non, le bocal H2 prend 1,8 m à l'intérieur de votre gros bocal. Dans le monde des microservices granulaires, des fonctions sans serveur et lambda, peu importe ce que vous mettez dans vos applications.

Je recommanderais également de vérifier les options dans @AutoConfigureTestDatabase. Je l'utilise avec @SpringBootTest, mais il peut également être utilisé avec d'autres annotations, à savoir @DataJpaTest, toutes deux mentionnées ci-dessus:  enter image description here

6
yuranos87

Vous devrez utiliser les profils de ressort - https://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html#howto-set-active-spring- profils

Vous définissez un profil actif à l'aide de "spring.profiles.active = development", puis en incluant H2 dans votre profil de développement.

Les exemples utilisent YAML, mais ils fonctionnent également dans les fichiers de propriétés standard.

2
Quinton Delpeche