Surefire没有接受Junit 5测试

时间:2016-05-01 18:32:16

标签: java maven junit maven-surefire-plugin junit5

我用JUnit 5编写了一个简单的测试方法:

public class SimlpeTest {
    @Test
    @DisplayName("Some description")
    void methodName() {
        // Testing logic for subject under test
    }
}

但是当我跑mvn test时,我得到了:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running SimlpeTest
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

不知何故,surefire没有认出那个测试类。我的pom.xml看起来像是:

<properties>
    <java.version>1.8</java.version>
    <junit.version>5.0.0-SNAPSHOT</junit.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.junit</groupId>
        <artifactId>junit5-api</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<repositories>
    <repository>
        <id>snapshots-repo</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
            <updatePolicy>always</updatePolicy>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

知道如何使这项工作吗?

15 个答案:

答案 0 :(得分:96)

maven-surefire-plugin,截至今天,not have full support of JUnit 5。在SUREFIRE-1206中添加此支持是一个未解决的问题。

因此,您需要使用custom provider。其中一个已由JUnit团队开发;从user guide开始,您需要为新API添加junit-platform-surefire-provider提供程序和TestEngine实现:

<build>
  <plugins>        
    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <!-- latest version (2.20.1) does not work well with JUnit5 -->
      <version>2.19.1</version>
      <dependencies>
        <dependency>
          <groupId>org.junit.platform</groupId>
          <artifactId>junit-platform-surefire-provider</artifactId>
          <version>1.0.3</version>
        </dependency>
        <dependency>
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter-engine</artifactId>
          <version>5.0.3</version>
        </dependency>
      </dependencies>
    </plugin>
  </plugins>
</build>

此外,请确保声明junit-jupiter-api依赖关系的范围为test

<dependencies>
  <dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.0.3</version>
    <scope>test</scope>
  </dependency>
</dependencies>

答案 1 :(得分:37)

更新2

Issue已在Maven Surefire插件v2.22.0

中修复

New version可在Maven Central Repository上找到。

<强>的Maven

<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.0</version>
</dependency>

<强>摇篮

compile group: 'org.apache.maven.plugins', name: 'maven-surefire-plugin', version: '2.22.0'

更新

正如Marian所指出的,最新版本的 JUnit 5平台Surefire提供程序(1.2.0)支持最新版本的 Maven Surefire插件(2.21.0)

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <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>
            </dependencies>
        </plugin>


示例

<强>的pom.xml

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.2.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <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>
            </dependencies>
        </plugin>
    </plugins>
</build>

<强> TestScenario.java

package test;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class TestScenario {

    @Test
    @DisplayName("Test 2 + 2 = 4")
    public void test() {
        Assertions.assertEquals(4, 2 + 2);
    }
}

输出(mvn clean install)

  

...
  [INFO] --- maven-surefire-plugin:2.21.0 :test(default-test)@test ---   [INFO]
[INFO]   -------------------------------------------------- -----
[信息]测试
[信息]   -------------------------------------------------- -----
[INFO]运行test.TestScenario
[INFO]测试运行:1,失败:0,   错误:0,跳过:0,经过的时间:0.005秒 - 在test.TestScenario中   
[INFO]
[INFO]结果:
[INFO]
[INFO] 测试运行:1 ,   失败:0,错误:0,跳过:0
  ...

直到今天最简单的方式:

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

答案 2 :(得分:10)

来自JUnit 5 documentation

  

从版本2.22.0开始,Maven Surefire提供本机支持   用于在JUnit平台上执行测试。

此外,您还可以阅读maven-surefire-plugin documentation

  

使用JUnit 5平台

     

要开始使用JUnit Platform,您至少需要添加一个   TestEngine实现到您的项目。例如,如果您想   使用Jupiter编写测试,添加测试工件junit-jupiter-engine   到POM中的依赖项

所以这足以进行JUnit 5测试:

<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>davidxxx</groupId>
    <artifactId>minimal-pom-junit5</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <junit-jupiter.version>5.2.0</junit-jupiter.version> 
        <!--optional below but good practice to specify our java version-->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

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

        <!--optional below -->
        <!-- add any JUnit extension you need such as -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

</project>

在GitHub空间上,我添加了一个工作示例Maven项目,您可以浏览/克隆它。
网址:https://github.com/ebundy/junit5-minimal-maven-project

答案 3 :(得分:5)

我遇到了JUnit5和Maven的这个问题,但也注意到,即使 junit-jupiter-engine被添加为依赖项,测试也会在某些项目上运行,而不是在其他即可。我在评论中看到了相同的模式:在上面的@Alex评论中你可以看到他没有任何问题,即使是早期版本的surefire / junit / platform。

在我挠了一段时间之后,我意识到那些测试无法运行的项目是那些测试方法名称dit 包含单词“test”的项目”。虽然这不是http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html

的强制要求

换句话说: 只是用

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.2.0</version>
        <scope>test</scope>
    </dependency>

@Test
public void something() {
    assertTrue(true);
}

不会被运行,而

@Test
public void testSomething() {
    assertTrue(true);
}

将会运行!

这个问题随着俄罗斯娃娃展开......

无论如何,为@Mikhail Kholodkov +1,其最新答案立即解决了所有问题!

答案 4 :(得分:4)

我在2019年8月遇到了同样的问题,我在这里问过:Maven silently fails to find JUnit tests to run。这些答案使我朝着正确的方向前进,但是我发现您可以更加简洁地解决问题。我从JUnit5 sample Maven project复制了我的解决方案。

从JUnit 5.5.1和maven-surefire-plugin 2.22.2开始,您不需要添加junit-platform-surefire-provider依赖项。在您的pom.xml中指定一个依赖项和一个插件就足够了:

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.5.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
    </plugins>
</build>

答案 5 :(得分:2)

作为补充,surefire 2.22.0 + junit 5.2.0 +平台1.2.0也可以使用。附件是供您参考的工作pom:

    <?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.jjhome.junit5</groupId>
    <artifactId>junit5-hone</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0-SNAPSHOT</version>
    <name>junit5-home</name>

    <properties>
        <maven.compiler.source>1.6</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit5.version>5.2.0</junit5.version>
        <platform.version>1.2.0</platform.version>
        <surefire.version>2.22.0</surefire.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>${platform.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-runner</artifactId>
            <version>${platform.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${surefire.version}</version>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.platform</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>${platform.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-engine</artifactId>
                        <version>${junit5.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

答案 6 :(得分:1)

我遇到了类似的问题,导致Surefire识别零测试。

我的问题与以下内容有关(来自JUnit 5.1.0 / maven文档):

  

由于Surefire 2.20中的内存泄漏以及在Java 9上运行的问题,junit-platform-surefire-provider目前仅适用于Surefire 2.19.1。

我试图使用最新版本的Surefire(2.21.0)和junit-platform-surefire-provider(1.1.0),但它不起作用(在Java 8或9中都没有)

切换回Surefire 2.19.1解决了我的问题。

根据this issue,一个修复程序将包含在junit-platform-surefire-provider的1.2.0版本中(目前仅作为SNAPSHOT提供)。

答案 7 :(得分:0)

更新到maven-surefire-plugin:2.20可以毫无问题地运行Junit5测试。

但我在Junit5上使用M6版本。

答案 8 :(得分:0)

There is open issue for surefire 2.20

它适用于我的surfire 2.19 + junit-platform- * 1.0.3

答案 9 :(得分:0)

我注意到我能够使它正常工作的一件事:

  • 命名测试类ClinicCalendarShould不会被maven接受
  • 命名我的测试班ClinicCalendarTest会被maven接受

因此,默认情况下,除非我缺少某种配置或参数或surefire插件中的任何内容,否则您需要将测试类命名为XXXTest。

答案 10 :(得分:0)

在我的情况下,这是因为类路径(SUREFIRE-1527)中的TestNG。 Groovy 2.5.5 POM带有groovy-testng模块。

手动指定的测试框架提供程序(如https://maven.apache.org/surefire/maven-surefire-plugin/examples/providers.html所述)解决了该问题:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>

    <dependency>
        <groupId>org.apache.maven.surefire</groupId>
        <artifactId>surefire-junit-platform</artifactId>
        <version>2.22.1</version>
    </dependency>

答案 11 :(得分:0)

在我的情况下,surefire插件在jupiter-engine / api之后没有获得正确的版本。即使运行Maven 3.6.1和surefireplugin 2.22.2版也是如此!

现在,我的surefire-plugin配置如下:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-engine</artifactId>
                    <version>5.5.2</version>
                </dependency>
            </dependencies>
        </plugin>

        ...
    </plugins>
</pluginManagement>

此外,我不得不强制使用以下版本:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-engine</artifactId>
            <version>1.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-commons</artifactId>
            <version>1.5.2</version>
        </dependency>
    </dependencies>
</dependencyManagement>

看起来5.5.2链接到错误的平台版本1.3.2,而不是我的情况下是1.5.2。

所有JUnit5测试现在都已开始。即使使用2.22.0的surefire插件,对我来说也不是这种情况!

希望有帮助...

答案 12 :(得分:0)

junit5maven-surefire测试都失败了,我遇到了同样的问题。但是junit4运行正常。下面的组合对我有用,我不添加版本控制。使用junit-bom进行依赖性管理。使用spring-boot 2.1.4

   <dependencyManagement>
    <dependencies>
            <dependency>
                <groupId>org.junit</groupId>
                <artifactId>junit-bom</artifactId>
                <version>5.6.1</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <scope>test</scope>
        </dependency>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>
    </plugins>
</build>

请确保升级到最新版本的eclipse

答案 13 :(得分:0)

对我来说,解决方案是在类顶部下方添加注释。

@RunWith(JUnitPlatform.class)
public class MyTest {
 ....
}

然后甚至不需要surefire插件。

答案 14 :(得分:0)

小心嵌套测试。我有一个这样的测试类:

class AcrTerminalTest {
    @Nested
    class card_is_absent {
        AcrTerminal acrTerminal = new AcrTerminal(new CardAbsentFakeCardTerminal());

        @Test
        void isCardPresent_returns_false() {
            assertThat(acrTerminal.isCardPresent())
                    .isFalse();
        }
    }
}

仅运行 ./mvnw test -Dtest=AcrTerminalTest 失败,我需要在测试类名称后添加 *,例如 ./mvnw test -Dtest=AcrTerminalTest\*(见星号)。