web-dev-qa-db-fra.com

Initialisation d'une base de données avant le test Spring Boot

J'utilise JUnit pour tester mon application et tout fonctionne correctement tant que la base de données a été initialisée avant le test (en utilisant gradle bootRun pour fonctionner en tant qu'application Web). Cependant, si la base de données est vide, l'application ne semble initialiser aucun modèle ou entité avant le test. Y a-t-il un moyen pour moi de faire ça? J'ai fait l'hypothèse que la classe ApplicationRunner sera exécutée avant le test et initialisera les entités. Y a-t-il un moyen de le faire ou est-ce que j'utilise la mauvaise approche?

C'est ainsi que mon application.properties le fichier ressemble à:

server.port=8090
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=123456
server.ssl.key-password 123456
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.naming-strategy:org.hibernate.cfg.ImprovedNamingStrategy
application.logger.org.springframework=INFO

Ma base de données est stockée dans /src/main/Java/application/persistence/DbConfig.Java en utilisant une connexion DriverManagerDataSource. Et j'ai configuré ApplicationRunner pour exécuter ajouter quelques lignes à la base de données au démarrage.

modifier:

Je dois également ajouter que ce sont les annotations que j'utilise sur le fichier de test JUnit:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes={
    AdeyTrackApplication.class, 
    SecurityConfig.class, 
    WebConfig.class,
    AuthorizationController.class
    })
15
px06

Les réponses ci-dessus utilisent toutes la technique de chargement de schéma .sql où je devrais avoir un schéma .sql pour les tests. Je ne voulais pas le faire de cette façon car mon schéma serait en expansion et je préférerais ne pas passer par les tracas d'ajouter des entrées au schéma pendant que mes tests se développent.

Comme j'utilise Spring Boot, je suis tombé sur cette annotation qui semble résoudre le problème en exécutant d'abord bootRun puis en exécutant les tests.

Dans mes annotations de test, j'ai remplacé le @ContextConfigurations avec @SpringApplicationConfiguration et a laissé toutes les classes identiques. Cela semblait résoudre le problème. Alors maintenant, la tâche test appelle bootRun pour charger les classes et puis exécute les tests.

Voir @ SpringApplicationConfiguration

Espérons que cela aide toute personne confrontée au même problème.

4
px06

Il existe différentes options si vous ne souhaitez pas l'exécuter explicitement à partir de @Before JUnit hook.

  1. Utilisez fonction d'initialisation JDBC de Spring Boot , où vous placeriez schema.sql ou data.sql en src/test/resources dossier, afin qu'il ne soit récupéré que lors des tests.
  2. Utilisez annotation @Sql de Spring
28
luboskrnac

Vous pouvez utiliser l'annotation @Sql pour remplir votre base de données, par exemple ^

@Sql(scripts = "classpath:db/populateDB.sql")
2
MxWild