web-dev-qa-db-fra.com

JUnit 5 n'exécute pas la méthode annotée avec BeforeEach

JUnit 5 n'invoque pas ma méthode dans une classe de test annotée avec l'annotation @BeforeEach, où j'initialise certains champs de l'objet de test nécessaires aux tests. Lorsque j'essaie d'accéder à ces champs dans une méthode de test (méthode annotée avec @Test), j'obtiens évidemment une exception NullpointerException. J'ai donc ajouté des messages de sortie aux méthodes.

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class TestClass {
   private String s;

   public TestClass() {

   }

   @BeforeEach
   public void init() {
      System.out.println("before");
      s = "not null";
   }

   @Test
   public void test0() {
      System.out.println("testing");
      assertEquals("not null", s.toString());
   }

}

Dans la sortie des tests lors de l'exécution de mvn clean test, le message "testing" de la méthode test0() est annoté avec l'annotation @Test, mais le message "avant" n'est pas imprimé.

Running de.dk.spielwiese.TestClass
!!!testing!!!
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0 sec <<< FAILURE!
de.dk.spielwiese.TestClass.test0()  Time elapsed: 0 sec  <<< FAILURE!
Java.lang.NullPointerException
        at de.dk.spielwiese.TestClass.test0(TestClass.Java:24)

La seule raison évidente et la seule à laquelle je puisse penser est que la méthode init() n'est pas invoquée. La documentation de @BeforeEach dit

@BeforeEach est utilisé pour signaler que la méthode annotée doit être exécuté avant chaque @Test, @RepeatedTest, @ParameterizedTest, @TestFactory et @TestTemplate dans la classe de test actuelle.

J'ai aussi essayé d'exécuter les tests dans Eclipse et là, ils passent toujours sans erreur.

J'utilise maven 3.5.3 . J'ai déclaré JUnit Jupiter 5.1.0 comme dépendance dans mon pom.xml.

<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">
<modelVersion>4.0.0</modelVersion>

<groupId>de.dk</groupId>
<artifactId>spielwiese</artifactId>
<version>0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>Spielwiese</name>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-Assembly-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>de.dk.spielwiese.Spielwiese</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <appendAssemblyId>false</appendAssemblyId>
                <finalName>Spielwiese</finalName>
            </configuration>
            <executions>
                <execution>
                    <id>assemble-all</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>de.dk</groupId>
        <artifactId>util</artifactId>
        <version>0.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.1.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Pourquoi ma méthode init() n'est-elle pas appelée?

8
David

Votre méthode init() n'est pas appelée car vous n'avez pas demandé à Maven Surefire d'utiliser le fournisseur Surefire de la plate-forme JUnit.

Ainsi, étonnamment, votre test n'est même pas exécuté avec JUnit. Au lieu de cela, il est exécuté avec le support de Maven Surefire pour ce qu'ils appellent POJO Tests .

Ajouter ce qui suit à votre pom.xml devrait résoudre le problème.

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>1.1.0</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>
12
Sam Brannen

La réponse de Sam Brannen a fonctionné pour moi, mais il semble que cela ne fonctionne pas avec la version 2.22.0 de maven-surefire-plugin, sauf si vous mettez à niveau le fournisseur junit-platform-surefire vers 1.2.0. Être conscient!

0
Eric Romrell