it-swarm.com.de

Eclipse Mit JUnit 5 wurden keine Tests gefunden, die durch NoClassDefFoundError verursacht wurden

Das Problem

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.

Die Beschreibung

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 :

https://imgur.com/a/FTe9c

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

Ich habe es schon probiert

  • entfernen Sie den Testordner aus dem Erstellungspfad und fügen Sie ihn erneut hinzu.
  • starten Sie den Test mit der Maus über die mit @Test kommentierte Methode und klicken Sie auf "Als JUnit-Test ausführen". 
  • entfernen Sie JUnit aus Buildpath und fügen Sie es erneut hinzu
  • starten Sie Eclipse erneut
  • Ich habe das gesamte Projekt auch von einer Maschine auf eine andere Maschine verschoben und dort mit der bereitgestellten Eclipse-Installation versucht
  • um die Testmethode umzubenennen.
  • geben Sie die @ Test-Anmerkung erneut ein

Einige dieser Schritte finden Sie hier , aber am Ende blieb das Problem bestehen.

43
ShadowDragon

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:

 enter image description here

Siehe auch mein Video, das Java 9 und JUnit 5 in Eclipse Oxygen.1a in Aktion zeigt

15
howlger

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.

40

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.

Selection Of Maven Profile

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

16
Aldian

Ich habe das Problem behoben, indem ich mit der rechten Maustaste auf den Test geklickt und "Run Configurations" (Laufkonfigurationen ausführen) ausgewählt und die Auswahl "Test Runner:" in "JUnit 4" geändert habe, wie hier gezeigt:

 Screenshot of run configruations

Ich habe den Test erneut durchgeführt und es hat funktioniert.

14
stringVector

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>
6
Gerold Broser

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

2
mahe

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

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.

1
du-it

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>
1
Arvind Katte

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 !

1
T3rm1

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.

1
Mike B

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.

1

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>
0
Luciano Ortiz

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>

0
Harpreet Singh

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
0
armin.miedl