1
votes

Spring Boot n'exécute pas de tests unitaires lorsqu'il est ajouté à la gestion des dépendances

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:

  1. créer un projet maven avec un test unitaire SampleTest et le pom suivant.
  2. exécutez le test mvn .
  3. voir que SampleTest a été exécuté et a échoué
  4. décommentez le bloc dans pour importer Spring Boot
  5. exécuter le test mvn
  6. voir qu'aucun test n'a été exécuté et que la construction est réussie.

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);
    }
}


4 commentaires

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 dans depsManagement . 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 du junit-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).


3 Réponses :


1
votes

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

  1. Ajouter toutes les dépendances supplémentaires, transitives, avec une version explicite
  2. Ajoutez également le junit-bom à la section dependencyManagement avant celui de Spring Boot, pour forcer les versions
  3. Rétrograder vers JUnit 5.5.2 pour s'aligner sur la version gérée de Spring Boot


2 commentaires

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.



1
votes

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>


0 commentaires

1
votes

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.


1 commentaires

J'ai eu le même problème. Cela s'est résolu lorsque j'ai suivi la suggestion de @ shanky442. Merci!!