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