J'ai un test de classe permet de l' appeler TestSomething
, et un objet de test permet d' appeler celui - ci SomeObject
.
Maintenant , je besoin de cet objet dans chaque test Une nouveauté cette signifie que j'ai dans mon code une @BeforeEach
qui se charge cet objet dans un champ:
import me.test.SomeObject;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class TestSomething {
private SomeObject someObject;
@BeforeEach
public void load() {
someObject = new SomeObject();
}
@Test
public void test1() {
boolean result = someObject.checkForSomething();
Assertions.assertEquals(true, result);
}
@Test
public void test2() {
boolean result = someObject.checkForSomethingElse();
Assertions.assertEquals(false, result);
}
pom.xml du module de test:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>test</artifactId>
<groupId>me.test</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<properties>
<projectVersion>1.0.0</projectVersion>
<maven.deploy.skip>false</maven.deploy.skip>
</properties>
<artifactId>Tests</artifactId>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.0.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>me.test</groupId>
<artifactId>project</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
pas sûr si elle est pertinente, mais l'objet SomeObject
est dans un module distinct, et le module de test a une dépendance sur ce module avec Scope test
. (je l' ai essayé aussi provided
et compile
)
Alors maintenant , si je cours ces tests dans InteliJ ils fonctionnent très bien. mais maintenant , si je tente de construire mon projet les tests échouent, avec NullPointerExceptions parce someObject
est null
.
Maintenant , le travail de test i appeler la méthode load()
dans chaque test, mais ce n'est pas exactement ce que je veux.
Par défaut, Maven ne sera pas le test avec le moteur Jupiter
Afin d'avoir Maven Surefire exécuter des tests à tous, une implémentation TestEngine doit être ajouté à la classpath d'exécution.
Et ce n'est pas présent par défaut.
Donc , pour l' activer, vous devez configurer le maven-plugin-surefire qui exécute les tests unitaires comme indiqué dans la documentation Jupiter :
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
Quelle que soit la question n'est pas forcément facile à repérer, car Maven utilise un coureur qui est capable d'exécuter les tests Jupiter mais n'a pas réussi à exécuter les méthodes de crochet ...
Comme un indice: savoir si le coureur JUnit 5 est lancé , vous pouvez exécuter les tests avec le drapeau bavard tels que: mvn test -X
.
Si le coureur Jupiter est utilisé, vous devriez trouver des lignes qui ressemblent à :
[DEBUG] Surefire Annuaire du rapport: ... \ target \ Surefire-rapports
[DEBUG] En utilisant le fournisseur configuré org.junit.platform.surefire.provider.JUnitPlatformProvider