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
})
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.
Il existe différentes options si vous ne souhaitez pas l'exécuter explicitement à partir de @Before
JUnit hook.
schema.sql
ou data.sql
en src/test/resources
dossier, afin qu'il ne soit récupéré que lors des tests.Vous pouvez utiliser l'annotation @Sql pour remplir votre base de données, par exemple ^
@Sql(scripts = "classpath:db/populateDB.sql")