任何人都可以在几分钟内轻松重现此问题。
基础 Mavenquickstart
项目
maven-archetype-quickstart
借助 IntelliJ 2018.3 和 Maven 3.6.0,我使用 Maven 原型版本 1.4创建了一个全新的项目。
爪哇 11
在新项目的 POM 文件中,我将属性从 1.7 更改为11 maven.compiler.source
,maven.compiler.target
用于我当前使用的 Java 11.0.2,来自Azul Systems的Zulu。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
在 IntelliJ 的 Maven 面板上,我运行clean
和install
Lifecycle 事件。
在 JUnit 4 中运行测试
作为 的一部分install
,运行测试。这个quickstart
原型带有一个断言true
.
结果出现在Run
IntelliJ 的面板中。
[信息] 运行 work.basil.example.AppTest
[信息] 测试运行:1,失败:0,错误:0,跳过:0,经过时间:0.026 秒 - 在 work.basil.example.AppTest
所以我知道执行的测试。
JUnit 5,而不是 4
这一切都很好。现在让我们升级到 JUnit 5,看看问题所在。
在 POM 中,我更改了 JUnit 依赖项:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
……对此:
<dependencies>
<!--JUnit 5-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>
</dependencies>
木星进口(无年份测试)
编译器抱怨我的AppTest.java
文件。所以我改变了import
那里的陈述来使用这些jupiter
包。我只想在我的新 greedfield 项目中运行 JUnit 5 测试,而不需要老式的 JUnit 4 测试。所以进口从这个改变:
import static org.junit.Assert.assertTrue;
import org.junit.Test;
……对此:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
然后我执行Maven
> Lifecycle
> clean
& install
。
……瞧,问题是:我们的测试没有执行。Run
在IntelliJ 面板中看到的报告:
[信息] 运行 work.basil.example.AppTest
[INFO] 测试运行:0,失败:0,错误:0,跳过:0,经过时间:0.003 秒 - 在 work.basil.example.AppTest
➥ 为什么 JUnit 5 无法运行 JUnit 4 愉快运行的测试?
更新surefire
插件
我怀疑需要更新Maven Surefire 插件。所以在POM中我改变了这个:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
……对此:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
</plugin>
另一个clean
& install
。但没有更好的,仍然运行 0 个测试。
[信息] 运行 work.basil.example.AppTest
[信息] 测试运行:0,失败:0,错误:0,跳过:0,经过时间:0.004 秒 - 在 work.basil.example.AppTest
整个 POM
这是我的整个 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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>work.basil.example</groupId>
<artifactId>tester</artifactId>
<version>1.0-SNAPSHOT</version>
<name>tester</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!--JUnit 5-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
JUnit 库
执行 Maven clean
&后install
,会出现两个 JUnit 库:junit-jupiter-api
和junit-platform-commons
.
JUnit 5 的其他版本
我在我的junit-jupiter-api
依赖项中尝试了以下版本:
- 5.0.0-M1
- 5.1.1
- 5.3.0
- 5.3.2
- 5.4.0-M1
每次尝试时,我都会运行一个 Maven clean
& install
。没有更好的。这些版本中的每一个都报告了Tests run: 0
。
不要责怪maven-archetype-quickstart
实际上,我在使用完全不同的 Maven 原型的一个完全不同的项目中发现了这个问题。
为了确定这个错误的 JUnit 5 行为,我尝试了一个新的项目,使用非常简单的maven-archetype-quickstart
. 我发现了同样的行为:一切都可以编译,测试工具正在运行,但在 JUnit 5 下没有执行任何测试。