Mon projet est censé être hérité d'un parent personnalisé et en même temps utiliser Spring Boot
.
La solution standard pour cela consiste à utiliser la section
comme décrit ici .
Le problème est que lorsqu'une dépendance Spring Boot
est ajoutée dans la section, maven ne voit aucun test unitaire (Test runs = 0). J'ai reproduit cela avec des artefacts spring-boot-dependencies
et spring-boot-starter
.
Étapes à suivre pour reproduire:
SampleTest
et le pom suivant. test mvn
. SampleTest
a été exécuté et a échoué
pour importer Spring Boot
test mvn
J'ai eu des problèmes similaires avec les anciennes versions de surefire
, qui ne pouvaient pas trouver les tests JUnit5
de la même manière. Mais le pom efficace montre que dans ce cas, les versions des plugins sont correctement définies sur 3.0.0-M4
et ne sont pas remplacées par SpringBoot.
Pourriez-vous m'aider à résoudre le problème problème avec l'exécution des tests et appliquer correctement Spring Boot
dans ce cas?
src / test / java / org / example / SampleTest.java
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>spring-boot-import</artifactId> <version>1.0</version> <dependencyManagement> <!-- when this block is uncommented no unit tests are found in the project--> <!-- <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> --> </dependencyManagement> <properties> <version.java>11</version.java> <version.junit.jupiter>5.6.0</version.junit.jupiter> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <compilerVersion>${version.java}</compilerVersion> <release>${version.java}</release> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M4</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>3.0.0-M4</version> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${version.junit.jupiter}</version> <scope>test</scope> </dependency> </dependencies> </project>
pom.xml
L'exemple suivant n'a pas de parent: je viens de copier des plugins et les dépendances de celui-ci pour rester concis.
package org.example; import org.junit.jupiter.api.*; class SampleTest{ @Test void test(){ Assertions.assertEquals(0, 1); } }
3 Réponses :
L'inclusion des dépendances spring-boot-dependencies
modifie les dépendances transitives de la dépendance junit-jupiter-engine
.
La sortie de la dépendance mvn: l'arborescence
l'affichera.
Avant
[INFO] org.example:spring-boot-import:jar:1.0 [INFO] \- org.junit.jupiter:junit-jupiter-engine:jar:5.6.0:test [INFO] +- org.apiguardian:apiguardian-api:jar:1.1.0:test [INFO] +- org.junit.platform:junit-platform-engine:jar:1.5.2:test [INFO] | +- org.opentest4j:opentest4j:jar:1.2.0:test [INFO] | \- org.junit.platform:junit-platform-commons:jar:1.5.2:test [INFO] \- org.junit.jupiter:junit-jupiter-api:jar:5.5.2:test
Après p >
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ spring-boot-import --- [INFO] org.example:spring-boot-import:jar:1.0 [INFO] \- org.junit.jupiter:junit-jupiter-engine:jar:5.6.0:test [INFO] +- org.apiguardian:apiguardian-api:jar:1.1.0:test [INFO] +- org.junit.platform:junit-platform-engine:jar:1.6.0:test [INFO] | +- org.opentest4j:opentest4j:jar:1.2.0:test [INFO] | \- org.junit.platform:junit-platform-commons:jar:1.6.0:test [INFO] \- org.junit.jupiter:junit-jupiter-api:jar:5.6.0:test
Comme vous pouvez le voir, le junit-platform-engine
et ses amis sont passés de 1.6.0 à 1.5.2 et l'API de 5.6.0 à 5.5.2 . Comme ces jars sont des versions incompatibles, vos tests ne seront plus exécutés.
Pour résoudre le problème, vous pouvez effectuer l'une des opérations suivantes
junit-bom
à la section dependencyManagement
avant celui de Spring Boot, pour forcer les versions Mec, tu es brillant. Je savais que spring-boot annule quelque chose, mais j'ai suspecté des plugins et je n'ai pas remarqué ce désordre Jupiter.
@khmarbaise Ce n'est pas ce qu'il dit, il pensait que la dépendance de Spring Boot remplaçait les versions de plugin.
L'autre solution consiste simplement à définir l'importation de junit jupiter avant le démarrage du printemps. Cela résout également le problème.
<dependencyManagement> <dependencies> <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> <version>5.6.0</version> <scope>import</scope> <type>pom</type> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
si vous utilisez spring boot 2.X, il supporte par défaut junit5 et tous les cas de test écrits dans junit 4 ne seront pas lus lors de la construction du projet ou lors de l'exécution de mvn test. Pour résoudre ce problème, utilisez l'extrait ci-dessous dans pom.xml
`<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.8</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <!-- Use the older JUnit 4 provider --> <artifactId>surefire-junit4</artifactId> <version>2.8</version> </dependency> </dependencies> </plugin>`
Remarque: l'utilisation de ce qui précède ignorera vos cas de test junit5.
J'ai eu le même problème. Cela s'est résolu lorsque j'ai suivi la suggestion de @ shanky442. Merci!!
Et ça devrait parce que? L'ajout de quelque chose à la section
dependencyManagement
n'ajoute pas les dépendances à votre projet.@ M.Denium Je ne m'attends pas à avoir automatiquement
spring-boot-starter-webflux
ou quelque chose comme ça, à cause de la décommentation du bloc dansdepsManagement
. Je m'attends à ce qu'il ne casse pas ce qui fonctionne déjà et je viens de trouver l'exemple le plus court pour reproduire le problème. En fait, votre commentaire est si laconique que je ne comprends pas ce que vous voulez dire. Pouvez-vous développer sur ce sujet? Savez-vous pourquoi le projet ne parvient pas à trouver les tests?J'ai manqué le fait que vous aviez déjà la dépendance junit et vous ne seriez pas le premier (ni le dernier) à mal comprendre la section
dependencyManagement
.Le
dependencyManagement
importe les dépendances gérées par Spring Boot et modifie certaines des versions de dépendance dujunit-jupiter-engine
, car elles sont probablement définies explicitement. Ils sont rétrogradés à 5.5.2 qui sont probablement incompatibles. Si vous exécutez une vérification de dépendance maven avec des transitives, vous verrez (si vous comparez le befopre et après).