Launcher kann nicht ohne mindestens eine TestEngine erstellt werden; Erwägen Sie, dem Klassenpfad in Junit 5 eine Engine-Implementierungs-JAR hinzuzufügen

Lesezeit: 5 Minuten

Ich habe folgende Ausnahme erhalten, als ich versuchte, den Testfall in junit5 auszuführen:

Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.19:test (default-test) on project CRUD-App: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.19:test failed: There was an error in the forked process
org.junit.platform.commons.util.PreconditionViolationException: Cannot create Launcher without at least one TestEngine; consider adding an engine implementation JAR to the classpath
   at org.junit.platform.commons.util.Preconditions.condition(Preconditions.java:161)
   at org.junit.platform.launcher.core.DefaultLauncher.<init>(DefaultLauncher.java:52)
   at org.junit.platform.launcher.core.LauncherFactory.create(LauncherFactory.java:42)
   at org.junit.platform.surefire.provider.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:59)
   at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:286)
   at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:240)
   at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121)

pom.xml

<dependencies>
    ...
    <dependency>
        <groupId>org.junit</groupId>
        <artifactId>junit5-api</artifactId>
        <version>5.0.0-SNAPSHOT</version>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <plugins>        
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>1.0.0-M2</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

Testklasse:

public class PersonServiceTest {

    final Database database = Database.from("jdbc:h2:mem:" + App.DB_NAME);

    final PersonService personService = new PersonService(database);

    public PersonServiceTest() {
    }

    @Test
    @DisplayName("@Person#insert()")
    public void testInsert() {
        personService.insert(new PersonBuilder()
                .setId(1).setName("Bhuwan")
                .setAddress("KTM")
                .setContactNo("984849").createPerson()
        );
    }

}

Maven-Ziel: mvn test

Benutzeravatar von Sam Brannen
Sam Brannen

Mischen ALPHA Snapshot-Artefakte (d. h. org.junit:junit5-api:5.0.0-SNAPSHOT) mit M2 Artefakte (dh org.junit.platform:junit-platform-surefire-provider:1.0.0-M2), geht nicht.

Der Maven Abschnitt in der Bedienungsanleitung schlägt vor, die zu überprüfen pom.xml von dem junit5-maven-consumer Projekt. Wenn Sie diesem Beispiel folgen, erhalten Sie am Ende etwas wie das Folgende.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <junit.jupiter.version>5.0.0-M2</junit.jupiter.version>
    <junit.platform.version>1.0.0-M2</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>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>${junit.platform.version}</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>${junit.jupiter.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>
</dependencies>

Zu schreiben Ihre Tests, Sie brauchen nur die junit-jupiter-api; jedoch um laufen Ihre Tests müssen Sie haben a TestEngine auf dem Klassenpfad. Für JUnit braucht man also Jupiter junit-jupiter-engine auch auf dem Klassenpfad.

Wie Nicolai Parlog betonte, könnte man hinzufügen junit-jupiter-engine als Abhängigkeit für die maven-surefire-plugin; das würde jedoch nicht beinhalten JupiterTestEngine im Klassenpfad für Ihre IDE.

Wenn Sie nur Tests über Maven oder mit einer aktuellen Beta-Version von IntelliJ 2016 (mit integrierter Unterstützung für JUnit 5) durchführen, ist es Ihnen möglicherweise egal, ob JupiterTestEngine befindet sich im Klassenpfad in Ihrer IDE. Aber … wenn Sie Eclipse, NetBeans oder eine Nicht-Beta-Version von IntelliJ verwenden, möchten Sie das auf jeden Fall JupiterTestEngine auch auf dem Klassenpfad in der IDE.

Grüße,

Sam (Core-JUnit-5-Committer)

Bin hier gelandet, seit ich mit Gradle und JUnit 4 denselben Fehler erhalten habe. Die Lösung in diesem Fall finden Sie in der Dokumente:

Die JUnit-Plattform kann JUnit 4-basierte Tests ausführen, solange Sie eine testImplementation-Abhängigkeit von JUnit 4 und eine testRuntimeOnly-Abhängigkeit von der JUnit Vintage TestEngine-Implementierung ähnlich der folgenden konfigurieren.

Ein Testmotor wird ebenfalls benötigt:

dependencies {
    testImplementation("junit:junit:4.13.2")
    testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.8.2")
}

Benutzeravatar von Nicolai Parlog
Nicolai Parlog

Das Maven Surefire Plugin benötigt nicht nur den Provider JUnit 5 sondern auch einen TestEngine Implementierung zum Ausführen von Tests. Um die zu zitieren JUnit 5-Dokumente:

Damit Maven Surefire überhaupt Tests durchführen kann, a TestEngine
-Implementierung muss dem Laufzeit-Klassenpfad hinzugefügt werden.

Dementsprechend funktioniert folgendes:

<build>
    <plugins>        
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>1.0.0-M4</version>
                </dependency>
                <dependency>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-engine</artifactId>
                    <version>5.0.0-M4</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.0.0-M4</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Beachten Sie, dass diese Konfiguration die Engine zu einer Abhängigkeit des Surefire-Plugins macht. nicht Ihres Testcodes.

Durch einfaches Hinzufügen der folgenden Abhängigkeit wurde dieses Problem gelöst.

testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.8.2'

Ich löse es ändernd

classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.8.RELEASE"

Zu

classpath "org.springframework.boot:spring-boot-gradle-plugin:2.2.0.RELEASE"

1444510cookie-checkLauncher kann nicht ohne mindestens eine TestEngine erstellt werden; Erwägen Sie, dem Klassenpfad in Junit 5 eine Engine-Implementierungs-JAR hinzuzufügen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy