No se puede crear Launcher sin al menos un TestEngine; considere agregar un JAR de implementación del motor a la ruta de clases en Junit 5

5 minutos de lectura

Obtuve la siguiente excepción cuando traté de ejecutar el caso de prueba en junit5:

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>

Clase de prueba:

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()
        );
    }

}

Objetivo experto: mvn test

Avatar de usuario de Sam Brannen
sam brannen

mezclando ALFA artefactos de instantáneas (es decir, org.junit:junit5-api:5.0.0-SNAPSHOT) con M2 artefactos (es decir, org.junit.platform:junit-platform-surefire-provider:1.0.0-M2), no funcionará.

El Experto sección en la guía del usuario sugiere revisar el pom.xml desde el junit5-maven-consumidor proyecto. Si sigue ese ejemplo, terminará con algo como lo siguiente.

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

A escribir tus pruebas, solo necesitas la junit-jupiter-api; sin embargo, para correr tus pruebas debes tener un TestEngine en el classpath. Para JUnit Júpiter, por lo tanto, necesita junit-jupiter-engine en el classpath también.

Como señaló Nicolai Parlog, podría agregar junit-jupiter-engine como una dependencia para el maven-surefire-plugin; sin embargo, eso no incluiría la JupiterTestEngine en el classpath para su IDE.

Si solo está ejecutando pruebas a través de Maven o con una versión beta reciente de IntelliJ 2016 (que tiene soporte integrado para JUnit 5), es posible que no le importe si JupiterTestEngine está en el classpath en su IDE. Pero… si está usando Eclipse, NetBeans o una versión no beta de IntelliJ, definitivamente querrá la JupiterTestEngine en el classpath en el IDE también.

Saludos,

sam (Comitedor principal de JUnit 5)

Terminé aquí desde que obtuve el mismo error al usar Gradle y JUnit 4. La solución en este caso se puede encontrar en el documentos:

La plataforma JUnit puede ejecutar pruebas basadas en JUnit 4 siempre que configure una dependencia testImplementation en JUnit 4 y una dependencia testRuntimeOnly en la implementación JUnit Vintage TestEngine similar a la siguiente.

También se necesita un motor de prueba:

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

Avatar de usuario de Nicolai Parlog
Nicolai Parlog

El complemento Maven Surefire no solo necesita el proveedor JUnit 5 sino también un TestEngine implementación para ejecutar pruebas. Para citar el Documentos JUnit 5:

Para que Maven Surefire ejecute cualquier prueba, un TestEngine
la implementación debe agregarse a la ruta de clase en tiempo de ejecución.

De acuerdo con eso, los siguientes trabajos:

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

Tenga en cuenta que esta configuración hace que el motor dependa del complemento surefire, no de su código de prueba.

simplemente agregando la dependencia a continuación resolvió este problema.

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

lo soluciono cambiando

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

a

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

¿Ha sido útil esta solución?