Search code examples
javamavenmaven-failsafe-pluginjunit5

How do I run JUnit 5 integration tests with the Maven Failsafe plugin?


The Maven Failsafe plugin won't find my JUnit 5 integration tests when I'm running the command mvn clean failsafe:integration-test, although it can find the files.

I have the junit-jupiter-api and junit-jupiter-engine as test dependencies:

<properties>
    <junit.jupiter.version>5.0.1</junit.jupiter.version>
</properties>

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

My integration tests are named correctly (following the **/*IT.java, **/IT*.java, or the **/*ITCase.java that included by default by Failsafe and excluded by default by Surefire).

Is there any way that I can use JUnit 5 tests with Failsafe?


Solution

  • Note that from the JUnit 5 documentation : junit-platform-surefire-provider should be not used any longer :

    Due to the release of Surefire 2.22.0, the junit-platform-surefire-provider from the JUnit team has been deprecated and will be discontinued in a subsequent release of the JUnit Platform.

    Additionally, you can also read in the maven-surefire-plugin documentation :

    Using JUnit 5 Platform

    To get started with JUnit Platform, you need to add at least a single TestEngine implementation to your project. For example, if you want to write tests with Jupiter, add the test artifact junit-jupiter-engine to the dependencies in POM

    So you have to specify this test dependency :

    <properties>
        <junit-jupiter.version>5.2.0</junit-jupiter.version>
    </properties> 
    
    <dependencies>
         [...]
         <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-engine</artifactId>
             <version>${junit-jupiter.version}</version>
             <scope>test</scope>
         </dependency>
         [...] 
    </dependencies>
    

    And the maven-failsafe-plugin declaration could be as simple as :

    <build>
        <plugins>           
            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.22.0</version>
            </plugin>
        </plugins>
    </build>