Das Problem
Immer wenn ich den JUnit-Test meines Projekts ausführe (mit JUnit 5 mit Java 9 und Eclipse Oxygen 1.a), tritt das Problem auf, dass Eclipse keine Tests finden kann.
Die Beschreibung
In der Ausführungskonfiguration kann Eclipse nicht einmal die mit @Test kommentierte Methode finden, sondern zeigt mir nur " (alle Methoden) ". Das folgende Bild gibt hoffentlich einen besseren Einblick in mein Setup:
Konsolenausgabe:
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
Was ich bisher versucht habe
Ich habe es schon versucht
- um den Testordner aus dem Erstellungspfad zu entfernen und erneut hinzuzufügen.
- Um den Test zu starten, bewegen Sie den Mauszeiger über die mit @Test kommentierte Methode und klicken Sie dann auf "Als JUnit-Test ausführen".
- Entfernen Sie JUnit aus Buildpath und fügen Sie es erneut hinzu
- Starten Sie Eclipse neu
- Ich habe auch das gesamte Projekt des Projekts von einem Computer auf einen anderen verschoben und es mit der dort bereitgestellten Eclipse-Installation versucht
- um die Testmethode umzubenennen.
- um die @ Test-Annotation erneut einzugeben
Einige dieser Schritte finden Sie hier , aber am Ende blieb das Problem bestehen.
Antworten:
Sie sind auf den Eclipse-Fehler 525948 gestoßen, der bereits behoben wurde und in der kommenden Version Oxygen.3 (4.7.3) vom 21. März 2018 veröffentlicht wird.
Als Abhilfe, setzen Sie Ihren Test - Code in einem separaten Projekt und fügen Sie das Projekt im Test auf die ModulePath, aber füge keine
module-info.java
zu Ihrem Testprojekt. 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
quelle
module-info.java
). In Eclipse verfügt ein Java-Projekt über einen einzelnen Ausgabeordner und kann daher nur einen oder keinen enthaltenmodule-info.java
. Sie können dem Modulpfad des Projekts jedoch Module hinzufügen, obwohl das Projekt nicht modular aufgebaut ist (keine hatmodule-info.java
).Ich habe das Problem behoben, indem ich mit der rechten Maustaste auf den Test geklickt und "Konfigurationen ausführen" ausgewählt und die Auswahl "Testläufer:" in "JUnit 4" geändert habe, wie hier gezeigt:
Ich habe den Test erneut durchgeführt und es hat funktioniert.
quelle
Ich habe das gleiche Problem mit STS 3.9.1. Es scheint ein Eclipse-Fehler zu sein. Um dies zu beheben, können Sie
junit-platform-launcher
Ihrem Projekt eine Testabhängigkeit hinzufügen ( https://mvnrepository.com/artifact/org.junit.platform/junit-platform-launcher ).So habe ich es für mein Projekt gemacht, das gradle verwendet:
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 Datei:
junit5MinorVersion=1.0
Ich glaube, dasselbe gilt, wenn Sie diese Ausnahme bei der Verwendung von IntelliJ IDEA sehen.
quelle
build.gradle
. Wenn Sie Maven verwenden, ist espom.xml
. Das Format für Maven ist jedoch unterschiedlich.In meinem Fall war das Problem ich selbst und keine IDE wie Eclipse. Ich habe die JUnit 4-Testklasse importiert.
Importieren Sie diesen also NICHT:
import org.junit.Test // JUnit 4
Aber importieren Sie das:
import org.junit.jupiter.api.Test // JUnit 5
quelle
In den bisherigen Antworten wurde das Problem der Freigabe von Code für andere Personen, die Eclipse nicht unbedingt verwenden, nicht angesprochen. Hier ist ein Satz. Der Schlüssel besteht darin, ein Maven-Profil zu verwenden, um den Eclipse-Fall zu lösen.
Es wird davon ausgegangen, dass Sie eine Eigenschaft
junit5.version
in Ihrem POM wie folgt definiert haben :<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit5.version>5.1.1</junit5.version> </properties>
profiles
Fügen Sie dann im Abschnitt 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 das soeben erstellte "Eclipse" -Profil.Damit sind Sie fertig. Ihre Eclipse führt erwartungsgemäß Junit 5-Tests aus, aber die von Ihnen hinzugefügte Konfiguration verschmutzt keine anderen Builds oder andere IDE
quelle
Das Hinzufügen dieser Maven-Abhängigkeit mit JUnit Jupiter (v.5.5.1) löst das Problem.
<dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-launcher</artifactId> <version>1.5.1</version> <scope>test</scope> </dependency>
quelle
EINFACHES FIX: (JUnit 5-Bibliothek hinzufügen)
ANLEITUNG:
quelle
Keine der Lösungen half:
Das Problem ist, dass Eclipse 2018-12 JUnit 5.3.1 unterstützt. Wenn Sie es mit einer vorherigen Version starten, schlägt es 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 (im Abhängigkeitsmanagement) sicherstellen, dass junit-jupiter-api auf dieselbe Version eingestellt ist. Du brauchst keinen Junit-Plattform-Runner oder -Luncher !
quelle
<junit-jupiter.version>5.4.1</junit-jupiter.version>
, um die im Spring-Boot verwendete Version (2.1.3.RELEASE) zu überschreiben.Nach der Antwort von Andrii Karaivanskyi folgt hier die POM-Erklärung von 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>
AKTUALISIEREN
Gemäß dem Kommentar von Alexander Wessel können Sie org.junit: junit-bom wie in seiner Antwort auf Frage Eclipse beschrieben verwenden. Es wurden keine Tests mit JUnit 5 gefunden, die von NoClassDefFoundError für LauncherFactory verursacht wurden .
quelle
scope=import type=pom
, und fügen Sie dann im Testbereich Abhängigkeiten zu junit-platform-launcher und junit-jupiter-engine hinzu, ohne im Abschnitt "Abhängigkeiten" eine Version anzugeben. Die Stückliste stellt immer sicher, dass Sie nur eine Version von JUnit Platform und Jupiter im Klassenpfad haben und dass die entsprechenden Versionen die beabsichtigten sind (z. B. 5.2.0 mit 1.2.0).Zu Ihrer Information, eine andere Ursache für "Keine mit junit5 gefundenen Tests" ist (versehentlich 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.
quelle
Ich hatte auch das gleiche Problem, dass Sie nur die Bibliothek hinzufügen müssen. Junit Library wird bereits zusammen mit Eclipse bereitgestellt, sodass Sie nur unten folgen müssen
Erstellungspfad> Erstellungspfad konfigurieren> Bibliothek> Bibliothek hinzufügen> JUnit> Weiter> Fertig stellen
Für mich geht das
quelle
Von Anfang an sagt Ihnen die Fehlermeldung, dass die Klasse nicht gefunden wurde:
NoClassDefFoundError
Das bedeutet, dass der Pfad zu junit das Problem ist.Klicken Sie mit der rechten Maustaste auf den Projektordner und wählen Sie Eigenschaften ODER wählen Sie den Projektordner und drücken Sie die Kombination cmd + i.
Wählen Sie aus der Liste "Java Build Path".
Das ist alles. Versuchen Sie erneut, den Test auszuführen.
quelle
das solltest du wissen :
@Before from junit4 geht mit @Test: " import org.junit.Test "
UND
@BeforeEach von Junit5 geht mit: " org.junit.jupiter.api.Test importieren "
Stellen Sie also sicher, dass Sie die Importe aus derselben Junit-Version verwenden, sonst funktioniert es vermutlich nicht.
quelle
Mit STS 3.9.1 habe ich das gleiche Problem. Derzeit benötige ich jedoch keine neuen JUnit5-Funktionen, daher habe ich versucht, die Verwendung einer älteren Version zu erzwingen. Wenn Sie maven verwenden, können Sie Ihrer pom.xml folgende Abhängigkeiten hinzufügen:
Dies hat den Trick für mich getan (zumindest solange ich JUnit5 nicht explizit benötige).
quelle
Ich habe das gleiche Problem nach dem Erstellen eines neuen Testfalls erhalten: Eclipse -> Neu -> JUnit-Testfall. Es wird eine Klasse ohne Modifikator für die Zugriffsebene erstellt. Ich könnte das Problem lösen, indem ich einfach eine Öffentlichkeit vor das Schlüsselwort class setze.
quelle
Wie jeder mitteilte, war es ein IDE-Fehler, den ich in
Eclipse
und ausprobiert hatteSTS
. In beiden Fällen schlägt dies fehl.Um dieses Problem zu umgehen, habe ich die Datei pom.xml wie folgt geändert.
Ich habe diese beiden Maven-Abhängigkeiten
junit-jupiter-engine
und hinzugefügtjunit-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>
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>
quelle
Ich benutze Eclipse 2019-09.
Ich musste die Junit-Bom-Version auf mindestens 5.4.0 aktualisieren. Ich hatte zuvor 5.3.1 und das verursachte die gleichen Symptome des OP.
Meine Konfiguration ist jetzt:
<dependencyManagement> <dependencies> <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> <version>5.5.2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
quelle
Da es nicht möglich ist, Codeblöcke in Kommentaren zu veröffentlichen, ist hier die POM-Vorlage, die ich in Projekten verwende, für die JUnit 5 erforderlich ist. 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 können sehen, dass Sie die Version jetzt nur noch an einer Stelle aktualisieren müssen, wenn Sie JUnit aktualisieren möchten. Außerdem muss die Versionsnummer der Plattform (in einer kompatiblen Version) nirgendwo in Ihrem POM angezeigt werden, sondern wird automatisch über den
junit-bom
Import verwaltet.quelle
Ich benutze:
Spring Tool Suite 4 Version: 4.4.2.RELEASE Build-ID: 201911201053 Java-Version: 1.8.0_191
und die angezeigte Meldung lautet Keine Tests mit Testläufer 'JUnit5' gefunden
Was für mich funktioniert hat, war die Konfiguration unten
<properties> <java.version>1.8</java.version> <junit-jupiter.version>5.5.2</junit-jupiter.version> <junit-platform.version>1.5.2</junit-platform.version> </properties> <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>
quelle
Sie vermissen den JUnit 5-Plattformstarter mit der Gruppe 'org.junit.platform', Name: 'junit-platform-launcher'
Fügen Sie einfach Ihr POM hinzu:
quelle
Der gleiche Fehler trat in der Eclipse-Version Oxygen.3a Release (4.7.3a) auf. Es gibt ein Problem bei der Nichtübereinstimmung von Maven-Abhängigkeiten. Um dieses Problem zu lösen, habe ich meine 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>
quelle
junit-platform-runner
folgenden Themen gesehen : " Runner zum Ausführen von Tests und Testsuiten auf der JUnit-Plattform in einer JUnit 4-Umgebung. "Sie können nur verwendet werden,
junit-jupiter
anstatt als Testabhängigkeitjunit-jupiter-api
,junit-platform-launcher
,junit-jupiter-engine
.<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.5.2</version> <scope>test</scope> </dependency>
quelle
Für mich habe ich den Erstellungspfad so konfiguriert, dass JUnit 5 Library hinzugefügt wird und auch die Abhängigkeit hinzugefügt wird
<dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-launcher</artifactId> <version>1.1.0</version> <scope>test</scope> </dependency>
getrennt.
quelle
Dieses Problem trat auch bei Eclipse (Version: 2019-12 (4.14.0)) auf. Die Lösung scheint entweder IntelliJ oder den Maven-Test zu verwenden, um solche Tests in Eclipse auszuführen.
quelle
Ich habe tatsächlich Spring-Tool-Suite-4-4.5.1 verwendet und hatte diesen Fehler, wenn ich eine Testklasse ausführen möchte. und die Lösung bestand darin, 'java build path', 'junit5' in Libraries java build path img hinzuzufügen
quelle
du solltest dich ändern
@Test public static void testmethod(){}
zu
@Test public void testmethod(){}
Der @ Test ist eine nicht unterstützte statische Methode
quelle
Ich bin auf den gleichen Fehler gestoßen, und in meinem Fall war es einfach
Project Properties > Maven > Update project
, das Projekt aufzurufen und / oder zu reinigen und neu aufzubauen.quelle
Habe gerade meine Test.class über das Eclipse-Menü hinzugefügt und funktioniert. Klicken Sie mit der rechten Maustaste, um zu projizieren -> Neu -> Andere -> JUnit -> JUnit-Testfall
quelle
Dies kann durch die Version von Junit-Plattform-Launcher / Junit-Plattform-Runner verursacht werden.
1.1.0 funktioniert nicht
1.4.1 funktioniert in meinem Setup.
Ich denke, dies ist ein Fehler in Eclipse, da es mit Bibliotheken höherer Versionen von junit und nicht mit anderen Versionen funktioniert.
Dies löste mein Problem. Die andere Entschließung erschien mir weniger machbar oder riskant. Vielen Dank.
quelle
Als ich meine Jupiter-API-Version in die neueste änderte, wurde sie gelöst. In der Zwischenzeit wird bei meinen Eclipse- und anderen Eclipse-Erweiterungsideen (z. B. STS) ein Fehler beim Erstellen des Pfads angezeigt. Ide zwingt mich bei jedem Maven-Update, die JRE-Systembibliothek festzulegen.
quelle