肯定不会接受 JUnit 5的测试

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

不知怎么的,我肯定没认出那个测试类。我的 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>

有什么办法吗?

85380 次浏览

到目前为止,maven-surefire-plugin是做 没有对 JUnit 5的完全支持的。在 1206中添加这种支持是一个公开的问题。

因此,您需要使用 自定义提供商。JUnit 团队已经开发了一个; 从 用户指南开始,您需要为新 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>

更新到 maven-surefire-plugin:2.20运行 Junit5测试没有问题。

但是我在六月五号使用的是 M6版本。

2.20版肯定有未解决的问题

它在 surfire 2.19 + junit-Platform-* 1.0.3中对我很有用

更新2

问题 已经在 Maven Surefire Plugin v2.22.0中修复

新版本 可在 Maven Central Repository 下载。

玛文

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

更新

玛丽安指出,JUnit 5 Platform Surefire Provider (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>

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 ] < br > [ INFO ] -------------------------------------------------------
[INFO] T E S T S
[INFO] ————————————————-< br > [ INFO ]运行测试。 TestScenario < br > [ INFO ]测试运行: 1,失败: 0, 错误: 0,跳过: 0,运行时间: 0.005 s-in test
[ INFO ] < br > [ INFO ]结果: < br > [ INFO ] < br > [ 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>

我也遇到过类似的问题,导致 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解决了我的问题。

根据 这个问题,junit-Platform-surefire-Provider (目前仅以 SNAPSHOT 的形式提供)的1.2.0版本中将包含一个补丁。

我在使用 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);
}

将被运行!

这个问题就像一个俄罗斯娃娃。

无论如何,+ 1@Mikhail Kholdkov,他更新的答案可以一次性解决所有问题!

作为补充,sure fire 2.22.0 + junit 5.2.0 + Platform 1.2.0也可以工作。附件是一个工作彩球,供您参考:

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

来自 JUnit 5文档:

从版本 2.22.0开始,MavenSurefire 提供了本地支持 用于在 JUnit 平台上执行测试。

此外,你可以在 maven-surefire-plugin文档中读到:

使用 JUnit5平台

要开始使用 JUnit 平台,您至少需要添加一个 实现到您的项目。例如,如果您想 用 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 项目。
网址: < a href = “ https://github.com/ebundy/junit5-mini-maven-project”rel = “ norefrer”> https://github.com/ebundy/junit5-minimal-maven-project

有一件事我注意到,我能让它工作:

  • 命名我的测试类 ClinicCalendarShould不会被 maven 选中
  • 命名我的测试类 ClinicCalendarTest确实会被 Maven 选中

因此,除非我在 surefire 插件中遗漏了某种配置或参数或其他内容,否则默认情况下,您需要将测试类命名为 XXXTest。

在我的例子中,这是因为类路径(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>

我在2019年8月遇到了同样的问题,我在这里问到: Maven 无声地找不到要运行的 JUnit 测试。这些答案把我引向了正确的方向,但我发现你可以更简洁地解决这个问题。我从 JUnit5样本 Maven 项目复制了我的解决方案。

对于 JUnit 5.5.1和 maven-surefire-plugin2.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>

在我的例子中,这个注定成功的插件在木星引擎/api 上没有得到正确的版本。即使运行 Maven3.6.1 und surefirepluginVersion2.22.2也是如此!

现在,我的 sure-fire 插件配置看起来是这样的:

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

所有的 JUnit5测试现在都可以使用了,即使使用了2.22.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 的最新版本

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

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

那么即使是万无一失的插件也不是必需的。

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

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\*(参见星号)。

这是由 速度18https://stackoverflow.com/a/51796487/1619489之上的一些行注释的

对我来说很容易:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.5</version>
</parent>


<build>
<finalName>app-console-services</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
</plugins>
</build>

这种依赖。

<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
</dependency>

2022年最新情况

以下措施现已奏效:

    <plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.2</version>
</plugin>
</plugins>

当然,这种依赖性也增加了:

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

现在检测到了。

根据我的案例经验,在 pom.xml 中的库 木星发动机上有 应该没有依赖性。然后可以使用插件 maven-surefire-plugin 并依赖于最新版本的 木星

我在从 junit4升级到5时遇到了类似的问题。

来自

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<type>jar</type>
<scope>test</scope>
<optional>true</optional>
</dependency>

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

我使用了一个 Eclipse 特性来创建单元测试类。右键单击类文件以测试—— > New —— > Other —— > JUnit Test Case —— > New JUnit Jupiter Test。这将很好地创建一个存根单元测试类。但是要注意的是,单元测试类不会有 公众人士类标识符,相应的带注释的测试方法也不会是 公众人士

单元测试在 Eclipse 中运行良好,但是当从 bash,‘ mvn test’运行时,将不会检测到相应的测试(也没有警告)。

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

如果您恢复到 junit4,‘ mvn test’将向您发出警告。

Tests in error:
initializationError(com.mycompany.operations.ConvertExcelTest): The class com.mycompany.operations.ConvertExcelTest is not public.
initializationError(com.mycompany.operations.ConvertExcelTest): Test class should have exactly one public constructor
initializationError(com.mycompany.operations.ConvertExcelTest): Method testExecute_excel97File() should be public
Tests run: 3, Failures: 0, Errors: 3, Skipped: 0

对我来说,解决方案是将相应的测试类公开,并将测试方法也公开。

public class ConvertExcelTest {


@Test
public void testExecute_excel97File() {