web-dev-qa-db-fra.com

Impossible de créer Lanceur sans au moins un TestEngine; envisager d'ajouter un JAR d'implémentation du moteur au chemin de classe dans Junit 5

J'ai eu l'exception suivante lorsque j'ai essayé d'exécuter le scénario de test au mois de juin 5:

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>

Classe de test:

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

}

Objectif Maven: mvn test

21
developerbhuwan

Pour commencer, vous mélangez [~ # ~] alpha [~ # ~] des artefacts de capture instantanée (c'est-à-dire org.junit:junit5-api:5.0.0-SNAPSHOT) avec M2 artefacts (c'est-à-dire org.junit.platform:junit-platform-surefire-provider:1.0.0-M2), qui ne fonctionnera jamais.

La section Maven du guide de l'utilisateur suggère de consulter la section pom.xml du projet junit5-maven-consumer . Si vous suivez cet exemple, vous vous retrouverez avec quelque chose comme ce qui suit.

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

Pour écrire vos tests, vous n'avez besoin que du junit-jupiter-api; cependant, pour exécuter vos tests, vous devez avoir un TestEngine sur le chemin de classe. Pour JUnit Jupiter, vous avez donc besoin de junit-jupiter-engine également sur le chemin de classe.

Comme l'a souligné Nicolai Parlog, vous pouvez ajouter junit-jupiter-engine comme dépendance pour le maven-surefire-plugin; cependant, cela n'inclurait pas le JupiterTestEngine dans le chemin de classe de votre IDE.

Si vous exécutez uniquement des tests via Maven ou avec une version bêta récente d'IntelliJ 2016 (qui prend en charge JUnit 5), vous ne vous souciez pas si JupiterTestEngine se trouve sur le chemin d'accès aux classes dans votre IDE. Mais ... si vous utilisez Eclipse, NetBeans ou une version non bêta d'IntelliJ, vous voudrez certainement le JupiterTestEngine sur le chemin de classe dans le IDE as bien.

Cordialement,

Sam ( noyau JUnit 5 committer)

24
Sam Brannen

Le plugin Maven Surefire a besoin non seulement du fournisseur JUnit 5 mais aussi d'une implémentation TestEngine pour exécuter des tests. Pour citer les documents JUnit 5 :

Pour que Maven Surefire exécute des tests, une implémentation TestEngine doit être ajoutée au chemin de classe d'exécution.

Conformément à cela les travaux suivants:

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

Notez que cette configuration fait du moteur une dépendance du plugin surefire, pas de votre code de test.

8
Nicolai