java - valuesource - parameterized test junit 5




Eclipse Nessun test trovato utilizzando JUnit 5 causato da NoClassDefFoundError (10)

Il problema

Ogni volta che eseguo i miei progetti test JUnit (usando JUnit 5 con Java 9 ed Eclipse Oxygen 1.a) incontro il problema che eclipse non riesce a trovare alcun test.

La descrizione

Sotto la configurazione della corsa, eclipse non riesce nemmeno a trovare il metodo annotato con @Test, ma invece mi mostra solo " (tutti i metodi) ". Speriamo che la seguente immagine dia una migliore occhiata alla mia configurazione:

Uscita 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

Quello che ho provato finora

Ci ho già provato

  • per rimuovere la cartella di prova dal percorso di compilazione e aggiungerla di nuovo.
  • per iniziare il test passando con il mouse sopra il metodo annotato con @Test e quindi fare clic su "Esegui come test JUnit".
  • rimuovere JUnit da Buildpath e aggiungerlo di nuovo
  • riavvia eclissi
  • Ho anche spostato l'intero progetto da una macchina a un'altra macchina e l'ho provato con l'installazione di eclipse fornita lì
  • per rinominare il metodo di prova.
  • per riscrivere l'annotazione @Test

Alcuni di questi passaggi possono essere trovati qui , ma alla fine il problema è rimasto.


Aggiungi nel tuo 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>

Cordiali saluti, un'altra causa di "Nessun test trovato utilizzando junit5" è (involontariamente o intenzionalmente) dichiarare i casi di test "privati":

// Example of test case that doesn't get included
@Test
private void testSomeMethod() {
}

Devono essere pubblici.


Dopo la risposta di Andrii Karaivanskyi ecco la dichiarazione di 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>

Finora le risposte non hanno risolto il problema della condivisione del codice con altre persone che non usano necessariamente Eclipse. Ecco una proposta. La chiave è usare un profilo maven per risolvere il caso Eclipse.

Presuppone che tu abbia definito una proprietà junit5.version nel tuo pom come:

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

quindi nella sezione profiles aggiungere quanto segue:

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

Tutto ciò che devi fare è selezionare il profilo nella tua Eclipse locale: fai clic con il pulsante destro del mouse sul tuo progetto e seleziona Maven > Select Maven Profiles... (o premi Ctrl + Alt + P ), quindi controlla il profilo "eclipse" abbiamo appena creato.

Con quello hai finito. Eclipse eseguirà i test Junit 5 come previsto, ma la configurazione aggiunta non inquinerà altre build o altri IDE


Ho lo stesso problema con STS 3.9.1. Sembra un bug di Eclipse, tuttavia, per risolvere questo problema puoi aggiungere una dipendenza test junit-platform-launcher al tuo progetto ( https://mvnrepository.com/artifact/org.junit.platform/junit-platform-launcher )

Ecco come ho fatto per il mio progetto che utilizza 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}"
}

file gradle.properties:

junit5MinorVersion=1.0

Credo che lo stesso valga se vedi questa eccezione mentre usi IntelliJ IDEA.


Ho risolto il problema facendo clic con il tasto destro del mouse sul test e selezionando "Esegui configurazioni" e cambiando la selezione "Test runner:" in "JUnit 4" come mostrato qui:

Ho eseguito di nuovo il test e ha funzionato.


Nel mio caso, il problema era me stesso e nessun IDE come Eclipse. Ho importato la classe Test di JUnit 4.

Quindi NON importare questo:

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

Ma importa quello:

import org.junit.Test  // JUnit 4

Nessuna delle soluzioni ha aiutato:

Il problema è che Eclipse 2018-12 ha il supporto per JUnit 5.3.1. Se lo avvii con una versione precedente, fallirà.

Quindi assicurati di usare almeno 5.3.1.

5.4.0 funziona anche.

Nel caso in cui il tuo pom padre sia Spring Boot, devi assicurarti (nella gestione delle dipendenze) che junit-jupiter-api sia impostato sulla stessa versione. Non hai bisogno di junit-platform-runner o -launcher !


Stesso errore che ho riscontrato nella versione eclipse Oxygen.3a Release (4.7.3a). C'è un problema nella mancata corrispondenza delle dipendenze Maven. Per risolvere ho aggiornato il mio Pom.xml con le seguenti dipendenze.

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>


Ti sei imbattuto nel bug 525948 di Eclipse che è già stato corretto e che sarà pubblicato nella prossima versione Oxygen.3 (4.7.3), 21 marzo 2018.

Per ovviare al problema, inserisci il tuo codice di test in un progetto separato e aggiungi il progetto sotto test al modulepath, ma non aggiungere un module-info.java al tuo progetto di test. Con il nome del tuo progetto, classe e modulo, dovrebbe apparire come questo:

Vedi anche il mio video che mostra Java 9 e JUnit 5 in Eclipse Oxygen.1a in azione





junit5