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.
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 :
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
J'ai déjà essayé
Certaines de ces étapes peuvent être trouvées ici , mais le problème est resté.
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:
Voir aussi ma vidéo montrant Java 9 et JUnit 5 dans Eclipse Oxygen.1a en action
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.
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.
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.
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>
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).
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 .
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>
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 !
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.
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
.
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>
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>
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