Bei jedem JUnit-Test für Projekte (mit JUnit 5 mit Java 9 und Eclipse Oxygen 1.a) stoße ich auf das Problem, dass Eclipse keine Tests findet.
Bei der Laufkonfiguration kann Eclipse nicht einmal die mit @Test annotierte Methode finden, sondern zeigt stattdessen nur "(alle Methoden)" . Das folgende Bild gibt hoffentlich einen besseren Einblick in mein Setup :
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
Ich habe es schon probiert
Einige dieser Schritte finden Sie hier , aber am Ende blieb das Problem bestehen.
Sie sind auf den bereits behobenen Eclipse-Fehler 525948 gestoßen, der in der kommenden Veröffentlichung Oxygen.3 (4.7.3) vom 21. März 2018 veröffentlicht wird.
Als Problemumgehung fügen Sie Ihren Testcode in ein separates Projekt ein, und fügen Sie das zu testende Projekt dem Modulpfad hinzu. Fügen Sie jedoch kein module-info.Java
zu Ihrem Testprojekt hinzu. Bei der Benennung Ihres Projekts, Ihrer Klasse und Ihres Moduls sollte es ungefähr so aussehen:
Siehe auch mein Video, das Java 9 und JUnit 5 in Eclipse Oxygen.1a in Aktion zeigt
Ich habe das gleiche Problem mit STS 3.9.1. Es scheint wie ein Eclipse-Fehler. Um dies zu beheben, können Sie Ihrem Projekt eine Testabhängigkeit junit-platform-launcher
hinzufügen ( https://mvnrepository.com/artifact/org.junit.platform/junit-platform-launcher )
So habe ich mein Projekt gemacht, bei dem gradle verwendet wird:
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}"
}
datei gradle.properties:
junit5MinorVersion=1.0
Ich glaube, dass das gleiche gilt, wenn Sie diese Ausnahme bei der Verwendung von IntelliJ IDEA sehen.
Bei den bisherigen Antworten wurde das Problem der gemeinsamen Nutzung von Code mit anderen Personen, die Eclipse nicht unbedingt verwenden, nicht behoben. Hier ist ein Satz. Der Schlüssel ist, ein Maven-Profil zu verwenden, um den Eclipse-Fall zu lösen.
Es wird davon ausgegangen, dass Sie in Ihrem POM eine Eigenschaft junit5.version
wie folgt definiert haben:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit5.version>5.1.1</junit5.version>
</properties>
fügen Sie dann im Abschnitt profiles
Folgendes hinzu:
<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>
Danach müssen Sie nur noch das Profil in Ihrer lokalen Eclipse auswählen: Klicken Sie mit der rechten Maustaste auf Ihr Projekt und wählen Sie Maven > Select Maven Profiles...
(oder drücken Sie Ctrl + Alt + P), und überprüfen Sie dann das soeben erstellte "Eclipse" -Profil.
Damit sind Sie fertig. Auf Ihrem Eclipse werden erwartungsgemäß Junit 5-Tests ausgeführt, aber die hinzugefügte Konfiguration belastet andere Builds oder andere IDEs nicht
Folgende Andrii Karaivanskyis Antwort Hier ist die Erklärung von 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>
Mit STS 3.9.1 habe ich das gleiche Problem. Derzeit benötige ich jedoch keine neuen JUnit5-Funktionen. Daher habe ich versucht, eine ältere Version zu verwenden. Wenn Sie maven verwenden, können Sie Ihrer pom.xml folgende Abhängigkeiten hinzufügen:
<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>
Dies hat den Trick für mich gemacht (zumindest solange ich JUnit5 nicht explizit brauche).
Das Hinzufügen dieser Maven-Abhängigkeit mit JUnit Jupiter (v.5.5.1) behebt das Problem.
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.5.1</version>
<scope>test</scope>
</dependency>
Das gleiche Problem hatte ich nach dem Erstellen eines neuen Testfalls: Eclipse -> Neu -> JUnit Test Case. Es erstellt eine Klasse ohne Modifikator für Zugriffsebenen. Ich könnte das Problem lösen, indem Sie einfach ein public vor das class - Schlüsselwort setzen.
Da jeder wusste, dass es IDE Bug ist, habe ich versucht, Eclipse
und STS
. In beiden Fällen scheitert es.
Als Problemumgehung habe ich die Datei pom.xml wie folgt geändert.
Ich habe diese beiden Maven-Abhängigkeiten junit-jupiter-engine
und junit-platform-launcher
hinzugefügt.
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>
Stellen Sie außerdem sicher, dass Sie die Version der beiden Maven-Abhängigkeiten im Eigenschaften-Tag hinzufügen.
<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>
Keine der Lösungen hat geholfen:
Das Problem ist, dass Eclipse 2018-12 JUnit 5.3.1 unterstützt. Wenn Sie es mit einer früheren Version starten, schlägt dies fehl.
Stellen Sie also sicher, dass Sie mindestens 5.3.1 verwenden.
5.4.0 funktioniert auch.
Wenn Ihr übergeordneter POM Spring Boot ist, müssen Sie (in der Abhängigkeitsverwaltung) sicherstellen, dass junit-jupiter-api auf dieselbe Version gesetzt ist. Du brauchst nicht junit-platform-runner oder -launcher !
Zu Ihrer Information, eine weitere Ursache für "Keine Tests gefunden mit junit5" ist (unbeabsichtigt oder absichtlich), dass die Testfälle als "privat" deklariert werden:
// Example of test case that doesn't get included
@Test
private void testSomeMethod() {
}
Sie müssen öffentlich sein.
Da es nicht möglich ist, Codeblöcke in comments zu posten, ist hier die POM-Vorlage, die ich in Projekten verwende, die JUnit 5 erfordern. Dies ermöglicht das Erstellen und Ausführen als JUnit-Test in Eclipse und das Erstellen des Projekts mit einfachem 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>
Sie sehen, dass Sie die Version jetzt nur noch an einem Ort aktualisieren müssen, wenn Sie JUnit aktualisieren möchten. Außerdem muss die Versionsnummer der Plattform (in einer kompatiblen Version) an keiner Stelle in Ihrem POM erscheinen. Sie wird automatisch über den junit-bom
-Import verwaltet.
Fügen Sie in Ihrem POM hinzu:
<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>
Derselbe Fehler, dem ich in der Eclipse-Version Oxygen.3a Release (4.7.3a) gegenüberstand. Es gibt ein Problem in Maven Dependencies Mismatch. Um das Problem zu lösen, habe ich mein Pom.xml mit den folgenden Abhängigkeiten aktualisiert.
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>
In meinem Fall war das Problem ich selbst und kein IDE wie Eclipse. Ich habe die JUnit 4-Testklasse importiert.
Importiere diesen also NICHT:
import org.junit.Test // JUnit 4
Aber importiere das:
import org.junit.jupiter.api.Test // JUnit 5