131 votes

Eclipse Aucun test trouvé en utilisant JUnit 5 causé par NoClassDefFoundError pour LauncherFactory

Le problème

Chaque fois que je lance le test JUnit de mes projets (en utilisant JUnit 5 avec Java 9 et Eclipse Oxygen 1.a), je rencontre le problème qu'eclipse ne trouve aucun test.

La description

Sous la configuration d'exécution, eclipse ne peut même pas trouver la méthode qui est annotée avec @Test, mais me montre seulement " (toutes les méthodes) ". L'image suivante donne, je l'espère, un meilleur aperçu de mon installation :

https://imgur.com/a/FTe9c

Sortie de 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 construction et l'ajouter à nouveau.
  • pour lancer le test, il suffit de passer la souris sur la méthode annotée avec @Test et de cliquer sur "Run as JUnit Test".
  • supprimer JUnit du Buildpath et le rajouter à nouveau
  • redémarrer l'éclipse
  • J'ai également déplacé l'ensemble du projet d'une machine à une autre et l'ai essayé avec l'installation d'eclipse fournie.
  • pour renommer la méthode d'essai.
  • pour retaper l'annotation @Test

Certaines de ces étapes peuvent être trouvés ici mais au final, le problème est resté entier.

0 votes

Mais avez-vous essayé de trouver la différence comme indiqué dans la réponse à cette question ? stackoverflow.com/questions/34413/ ?

177voto

stringVector Points 203

J'ai résolu le problème en faisant un clic droit sur le test, en sélectionnant "Run Configurations" et en changeant la sélection "Test runner :" par "JUnit 4" comme indiqué ici :

Screenshot of run configruations

J'ai refait le test et ça a marché.

17 votes

C'est drôle de sélectionner "JUnit4" dans les configurations d'exécution tout en utilisant JUnit5. Je ne dirai pas que c'est une bonne solution sur laquelle je peux m'appuyer lorsque je m'occupe d'un gros projet.

2 votes

Je trouve également cette solution suspecte, il manque même une explication sur la raison pour laquelle cela fonctionne et les risques que l'on peut prendre.

1 votes

Si cela n'a pas résolu votre problème, allez dans l'onglet classpath de la même fenêtre et ajoutez JUnit aux bibliothèques Bootstrap.

78voto

J'ai le même problème avec STS 3.9.1. Il semble qu'il s'agisse d'un bug d'Eclipse, cependant, 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 ainsi que j'ai procédé 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}"
}

gradle.properties :

junit5MinorVersion=1.0

Je pense qu'il en va de même si vous voyez cette exception en utilisant IntelliJ IDEA.

0 votes

Dans quel fichier dois-je ajouter la dépendance ?

1 votes

Si l'on utilise gradle, on va généralement dans build.gradle . Si vous utilisez maven, c'est pom.xml . Le format pour maven est cependant différent.

1 votes

Cela a réglé le problème pour moi. Merci !

23voto

howlger Points 9134

Tu es tombé sur Bogue d'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.

Comme solution de rechange, mettez votre code de test dans un projet séparé et ajoutez le projet en cours de test au modulepath, mais n'ajoutez pas de module-info.java à votre projet de test. Avec le nommage de votre projet, de vos classes et de vos modules, cela devrait ressembler à quelque chose comme ceci :

enter image description here

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

0 votes

Placez votre code de test dans un projet séparé Vous voulez dire définir un autre module pour les tests ?

1 votes

@nullpointer Je veux dire créer un nouveau projet Java qui n'est pas modulaire (n'a pas de module-info.java ). Dans Eclipse, un projet Java n'a qu'un seul dossier de sortie et, par conséquent, il ne peut contenir qu'un seul ou aucun des éléments suivants module-info.java . Mais vous pouvez ajouter des modules au modulepath du projet même si le projet n'est pas modulaire (n'a pas de module-info.java ).

0 votes

La réponse n'est pas très claire. Pourriez-vous partager un exemple de structure/une capture d'écran pour la suggestion ?

21voto

Aldian Points 1647

Les réponses données jusqu'à présent n'ont pas abordé le problème du partage du code avec d'autres personnes qui n'utilisent pas nécessairement Eclipse. Voici une proposition. La clé est d'utiliser un profil maven pour résoudre le cas Eclipse.

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

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

puis dans le profiles ajouter 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>

Tout ce que vous avez à faire ensuite est de sélectionner le profil dans votre Eclipse local : Cliquez avec le bouton droit de la souris sur votre projet et sélectionnez Maven > Select Maven Profiles... (ou frappe Ctrl + Alt + P ), puis vérifiez le profil "eclipse" que nous venons de créer.

Selection Of Maven Profile

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

10voto

Gerold Broser Points 63

Suivant La réponse d'Andrii Karaivanskyi voici la déclaration POM de Maven :

<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>

UPDATE

Selon le commentaire de Alexander Wessel vous pouvez utiliser org.junit:junit-bom comme décrit dans sa réponse à la question Eclipse Aucun test trouvé en utilisant JUnit 5 causé par NoClassDefFoundError pour LauncherFactory .

1 votes

Ne déclarez pas de propriétés pour les versions jupiter et platform, utiliser la nomenclature à la place . Il suffit d'ajouter une dépendance sur la nomenclature dans la balise dependencyManagement avec scope=import type=pom puis ajouter des dépendances à junit-platform-launcher et junit-jupiter-engine dans la portée de test, sans donner de version dans la section des dépendances. La nomenclature garantit toujours que vous n'avez qu'une seule version de JUnit Platform et de Jupiter sur le classpath, et que les versions respectives sont celles prévues (par exemple, 5.2.0 avec 1.2.0).

0 votes

@AlexanderWessel Je n'ai pas de nomenclature. C'est juste un exemple qui montre quelles dépendances il faut déclarer avec Maven, où que ce soit.

1 votes

Le problème n'est pas de savoir si vous avez (ou plutôt si votre projet a) une nomenclature en soi. J'expliquais qu'en Importation de la nomenclature que JUnit 5 fournit Vous pouvez ainsi vous assurer que les versions de Junit Jupiter et de Junit Platform sont compatibles, et vous n'aurez pas besoin de déclarer une version dans les dépendances individuelles, et donc plus besoin de déclarer les propriétés de version. Pour être clair : votre exemple fait fonctionnent bien. Mais importer la nomenclature JUnit est un peu plus élégant (à mon humble avis) et, dans certaines circonstances, plus sûr.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X