web-dev-qa-db-fra.com

Eclipse Aucun test trouvé avec JUnit 5 causé par NoClassDefFoundError

Le problème

Chaque fois que j'exécute mes projets test JUnit (avec JUnit 5 avec Java 9 et Eclipse Oxygen 1.a), je rencontre le problème suivant: Eclipse ne peut trouver aucun test.

La description

Dans la configuration d'exécution, Eclipse ne peut même pas trouver la méthode annotée avec @Test, mais ne me montre que "(toutes les méthodes)" . L'image suivante donne un meilleur aperçu de ma configuration :

 https://imgur.com/a/FTe9c

Sortie de la console:

Java.lang.NoClassDefFoundError: org/junit/platform/launcher/core/LauncherFactory
    at org.Eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.<init>(JUnit5TestLoader.Java:31)
    at Java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at Java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at Java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at Java.base/Java.lang.reflect.Constructor.newInstance(Unknown Source)
    at Java.base/Java.lang.Class.newInstance(Unknown Source)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.createRawTestLoader(RemoteTestRunner.Java:368)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.createLoader(RemoteTestRunner.Java:363)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.defaultInit(RemoteTestRunner.Java:307)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.init(RemoteTestRunner.Java:222)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:206)
Caused by: Java.lang.ClassNotFoundException: org.junit.platform.launcher.core.LauncherFactory
    at Java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
    at Java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
    at Java.base/Java.lang.ClassLoader.loadClass(Unknown Source)
    ... 11 more

Ce que j'ai essayé jusqu'à présent

J'ai déjà essayé

  • pour supprimer le dossier de test du chemin de génération et l'ajouter à nouveau.
  • pour démarrer le test en survolant la méthode annotée avec @Test, puis cliquez sur "Exécuter en tant que test JUnit". 
  • supprimer JUnit de Buildpath et l'ajouter à nouveau
  • redémarrer Eclipse
  • J'ai également déplacé le projet entier d'un projet à un autre et l'ai essayé avec l'installation Eclipse fournie.
  • renommer la méthode de test.
  • retaper l'annotation @Test

Certaines de ces étapes peuvent être trouvées ici , mais le problème est resté.

43
ShadowDragon

Vous avez rencontré le bogue Eclipse 525948 qui a déjà été corrigé et qui sera publié dans la prochaine version Oxygen.3 (4.7.3), le 21 mars 2018.

En guise de solution de contournement, placez votre code de test dans un projet séparé et ajoutez le projet à tester au modulepath, sans ajouter de code module-info.Java à votre projet de test. Avec votre nom de projet, classe et module, cela devrait ressembler à ceci:

 enter image description here

Voir aussi ma vidéo montrant Java 9 et JUnit 5 dans Eclipse Oxygen.1a en action

15
howlger

J'ai le même problème avec STS 3.9.1. Cela ressemble à un bogue Eclipse, mais pour résoudre ce problème, vous pouvez ajouter une dépendance de test junit-platform-launcher à votre projet ( https://mvnrepository.com/artifact/org.junit.platform/junit-platform-launcher )

C'est ce que j'ai fait pour mon projet qui utilise gradle:

dependencies {
    // other stuff here

    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "5.${junit5MinorVersion}"
    testCompile group: 'org.junit.platform', name: 'junit-platform-launcher', version: "1.${junit5MinorVersion}"
}

fichier gradle.properties:

junit5MinorVersion=1.0

Je pense que la même chose s’applique si vous voyez cette exception lors de l’utilisation d’IntelliJ IDEA.

40

Jusqu'à présent, les réponses n'abordaient pas le problème du partage de code avec d'autres personnes qui n'utilisaient pas nécessairement Eclipse. Voici une proposition. La solution consiste à utiliser un profil Maven pour résoudre le cas Eclipse.

Cela suppose que vous avez défini une propriété junit5.version dans votre pom comme ceci:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit5.version>5.1.1</junit5.version>
</properties>

puis dans la section profiles ajoutez ce qui suit:

<profiles>
    <profile>
        <id>Eclipse</id>
        <dependencies>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-engine</artifactId>
            </dependency>
            <dependency>
                <groupId>org.junit.platform</groupId>
                <artifactId>junit-platform-launcher</artifactId>
            </dependency>
        </dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-engine</artifactId>
                    <version>${junit5.version}</version>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-launcher</artifactId>
                    <version>1.1.1</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    </profile>
</profiles>

Après cela, il vous suffit de sélectionner le profil dans votre Eclipse local: Faites un clic droit sur votre projet et sélectionnez Maven > Select Maven Profiles... (ou appuyez sur Ctrl + Alt + P), puis vérifiez le profil "Eclipse" que nous venons de créer.

Selection Of Maven Profile

Avec ça vous avez fini. Votre Eclipse exécutera les tests Junit 5 comme prévu, mais la configuration que vous avez ajoutée ne polluera pas les autres versions ou les autres IDE.

16
Aldian

J'ai résolu le problème en cliquant avec le bouton droit de la souris sur le test, en sélectionnant "Exécuter les configurations" et en modifiant la sélection "Test coureur:" en "JUnit 4", comme indiqué ci-dessous:

 Screenshot of run configruations

J'ai refait le test et cela a fonctionné.

14
stringVector

Suite de Réponse de Andrii Karaivanskyi voici la déclaration de Maven POM:

<properties>
    ...
    <junit-jupiter.version>5.2.0</junit-jupiter.version>
    <junit-platform.version>1.2.0</junit-platform.version>
    ...
</properties>

<dependencies>
    ...
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit-jupiter.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <version>${junit-platform.version}</version>
        <scope>test</scope>
    </dependency>
    ...
</dependencies>
6
Gerold Broser

En utilisant STS 3.9.1, j'ai le même problème. Cependant, pour le moment je n'ai besoin d'aucune nouvelle fonctionnalité JUnit5, alors j'ai essayé de forcer l'utilisation d'une version plus ancienne Si vous utilisez maven, vous pouvez ajouter les dépendances suivantes à votre pom.xml:

<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-launcher</artifactId>
    <version>${junit.platform.version}</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>${junit.jupiter.version}</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <version>${junit.vintage.version}</version>
    <scope>test</scope>
</dependency>

Cela a fait l'affaire pour moi (du moins tant que je n'ai pas explicitement besoin de JUnit5).

2
mahe

J'ai eu le même problème après avoir créé un nouveau TestCase: Eclipse -> Nouveau -> JUnit Test Case. Il crée une classe sans modificateur de niveau d'accès. Je pourrais résoudre le problème en mettant simplement un mot-clé public avant le class .

1
du-it

Comme tout le monde a dit que c'était un bogue IDE, j'ai essayé dans Eclipse et STS. Dans les deux cas, cela échoue.

Pour résoudre ce problème, j'ai résolu le problème en modifiant le fichier pom.xml comme ci-dessous.

J'ai ajouté ces deux dépendances maven junit-jupiter-engine et junit-platform-launcher.

pom.xml

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit-jupiter.version}</version>
        <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform launcher -->
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <version>${junit-platform.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Veillez également à ajouter la version des deux dépendances maven dans la balise properties.

<properties>
    <Java.version>1.8</Java.version>
    <junit-jupiter.version>5.2.0</junit-jupiter.version>
    <junit-platform.version>1.2.0</junit-platform.version>
</properties>
1
Arvind Katte

Aucune des solutions n'a aidé:

Le problème est que Eclipse 2018-12 prend en charge JUnit 5.3.1. Si vous le démarrez avec une version antérieure, cela échouera.

Assurez-vous donc que vous utilisez au moins 5.3.1.

5.4.0 fonctionne aussi.

Si votre pom parent est Spring Boot, vous devez vous assurer (dans la gestion des dépendances) que junit-jupiter-api est défini sur la même version. Vous n'avez pas besoin de junit-platform-runner ou -launcher !

1
T3rm1

Pour votre information, une autre cause de "Aucun test trouvé avec junit5" est (par inadvertance ou intentionnellement) de déclarer les cas de test "privés":

// Example of test case that doesn't get included
@Test
private void testSomeMethod() {
}

Ils doivent être publics.

1
Mike B

Puisqu'il n'est pas possible de poster des blocs de code dans comments voici le modèle POM que j'utilise dans les projets nécessitant JUnit 5. Cela permet de construire et "Exécuter en tant que test JUnit" dans Eclipse et de construire le projet avec plain Maven. 

<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>group</groupId>
    <artifactId>project</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>project name</name>

    <dependencyManagement>
      <dependencies>
        <dependency>
        <groupId>org.junit</groupId>
        <artifactId>junit-bom</artifactId>
        <version>5.3.1</version>
        <type>pom</type>
        <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>

    <dependencies>
      <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <scope>test</scope>
      </dependency>

      <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <scope>test</scope>
      </dependency>

      <dependency>
        <!-- only required when using parameterized tests -->
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-params</artifactId>
        <scope>test</scope>
      </dependency>
    </dependencies>
</project>

Vous pouvez constater qu'il ne vous reste plus qu'à mettre à jour la version à un endroit si vous souhaitez mettre à jour JUnit. De plus, le numéro de version de la plate-forme n'a pas besoin d'apparaître (dans une version compatible) dans votre POM, il est automatiquement géré via l'importation junit-bom.

1
Alexander Wessel

Ajoutez dans votre POM:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit</groupId>
            <artifactId>junit-bom</artifactId>
            <version>5.3.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
0
Luciano Ortiz

Même erreur que j'ai rencontré dans la version Eclipse Oxygen.3a Release (4.7.3a). Il y a un problème dans Maven Dependencies mismatch.To résoudre, j'ai mis à jour mon Pom.xml avec les dépendances suivantes.

http://maven.Apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.netapp.junitnmactiopractice JunitAndMactioPractice 0.0.1-SNAPSHOT

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <Java.version>1.8</Java.version>
    <junit.jupiter.version>5.1.1</junit.jupiter.version>
    <junit.platform.version>1.1.1</junit.platform.version>
</properties>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>${Java.version}</source>
                <target>${Java.version}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit.jupiter.version}</version>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-runner</artifactId>
        <version>${junit.platform.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

0
Harpreet Singh

Dans mon cas, le problème était moi-même et aucun IDE comme Eclipse. J'ai importé la classe JUnit 4 Test.

Alors n'importez PAS celui-ci:

import org.junit.Test  // JUnit 4

Mais importez celui-là:

import org.junit.jupiter.api.Test // JUnit 5
0
armin.miedl