
《JUnit in Action》全新第3版封面截图
写在前面
结束了前面两个大板块共九章的内容,从第十章开始,全书将进入另一个新的板块,重点探讨构建和集成的相关话题。五年过去了,软件构建和集成的热度还在逐年攀升。这不仅得益于作者对技术趋势的高敏感度,更源于各类基于云平台云原生应用技术的日渐成熟与完善,而这背后几乎都有 AI 技术浪潮的推波助澜。相信 AI 还会进一步深刻重塑今后的软件开发范式,倒逼企业组织形态的深刻变革。暗潮涌动下,一个崭新的时代即将破晓。此刻正处在风口浪尖的每一位开发者们:你准备好了吗?
文章目录
- [第十章 用 Maven 3 运行 JUnit 测试](#第十章 用 Maven 3 运行 JUnit 测试)
-
- [10.1 Maven 解决的痛点问题](#10.1 Maven 解决的痛点问题)
- [10.2 从命令行新建一个 Maven 项目](#10.2 从命令行新建一个 Maven 项目)
- [10.3 pom.xml 中的主要标签](#10.3 pom.xml 中的主要标签)
第十章 用 Maven 3 运行 JUnit 测试
本章概要
- 从零创建
Maven项目- 用
JUnit 5测试Maven项目Maven插件的用法Maven Surefire插件的用法
第 10 ~ 13 章为本书的第三个模块,重点探讨 JUnit 5 与其他工具的协同。其中,本章介绍 Maven,第 11 章介绍 Gradle,第 12 章介绍 JUnit 5 与当前主流 IDE 的集成,第 13 章精讲持续集成工具。学习本章需结合附录 A,以加深对 Maven 基础概念和基本流程的了解。对熟悉 Maven 的开发者而言,本章难度不大,也可以作为复习材料查漏补缺。
10.1 Maven 解决的痛点问题
Maven 官网:https://maven.apache.org/。发音:/ˈmeɪvn/。
主要有两个:
- 定义了软件的基础构建方式;
- 对项目依赖实现了统一管理。
Maven 遵循 约定优于配置(Convention Over Configuration) 的设计原则,始终认为一个项目的构建系统应当尽可能简单好用,能让开发者从繁琐枯燥又严格的各种配置规则中解放出来,转而只对个别特殊情况进行说明。Maven 用一个 pom.xml 文件记录项目配置,包含项目的元信息、外部依赖、所需插件等。
约定优于配置的原则从 Maven 构建的文件夹结构体现出来,例如:
src/main/java/:存放Java源文件;src/test/java:存放项目的各类单元测试文件;target/:项目构建的根目录。
10.2 从命令行新建一个 Maven 项目
本地安装 Maven 后,可以从命令行创建一个默认的 Maven 项目:
首先确认 Maven 的版本:
powershell
> mvn --version
Apache Maven 3.9.11 (3e54c93a704957b63ee3494413a2b544fd3d825b)
Maven home: D:\apache-maven-3.9.11
Java version: 11.0.10, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-11.0.10
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
然后新建一个示例文件夹 C:\junitbook,并在该目录下运行如下命令:
powershell
> mvn archetype:generate -DgroupId="com.manning.junitbook" -DartifactId="maven-sampling" -DarchetypeArtifactid="maven-artifact-mojo"
若中途遇到停顿,一律按回车键(保持默认配置)继续,最后就会得到一个名为 maven-sampling 的 Maven 骨架项目。
上述命令的各参数含义:
-DgroupId=com.manning.junitbook:定义变量groupId,变量值为com.manning.junitbook。通常使用公司或组织的反向域名命名规则;-DartifactId=maven-sampling:定义变量artifactId,变量值为maven-sampling。这是项目的 构件 ID,也是项目的唯一标识符,通常为项目名称;-DarchetypeArtifactId=maven-archetype-mojo:定义变量archetypeArtifactId,变量值为maven-archetype-mojo。这是在指定要使用的archetype模板,maven-archetype-mojo是一个专门用于创建Maven项目的模板,其中预设了Maven项目的目录结构和必要的依赖项。
和原书不同的是,Maven 版本越新,生成的默认依赖版本越新。例如实测时的 JUnit 版本就升级到了 5.11:
xml
<?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>com.manning.junitbook</groupId>
<artifactId>maven-sampling</artifactId>
<version>1.0-SNAPSHOT</version>
<name>maven-sampling</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.release>17</maven.compiler.release>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.11.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<!-- Optionally: parameterized tests support -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- snip -->
</project>
上述配置中,dependencyManagement 通过 BOM(Bill of Materials)的方式管理了 JUnit 的版本;当中的 junit-bom 是一个特殊的 POM 文件,里面定义了所有 JUnit 相关组件的版本号。因此,实际 JUnit 各依赖项的版本都可以省略不写,统一为 junit-bom 指定的版本。
此外,实测过程中,部分插件可能 IDEA 无法顺利解析,比如这个 maven-project-info-reports-plugin 插件:
xml
<build>
<pluginManagement>
<plugins>
<!-- snip -->
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.6.1</version>
</plugin>
</plugins>
</pluginManagement>
</build>
首次导入 IDEA 时上述代码 L4 - L5 都有红色报错标记,提示 IDEA 无法解析该插件。
解决办法:从 Maven 线上的 中央仓库 手动导入该插件的 dependency 依赖,重新加载项目触发 IDEA 自动下载:
xml
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.6.1</version>
</dependency>
下载成功后,删除该 dependency 节点即可(慎重升级到最新版 3.9.0,后续生成文档时有兼容性报错)。
将该骨架项目导入 IDEA 的最终效果:

10.3 pom.xml 中的主要标签
从第二行开始,该项目的所有 Maven 配置都在 <project> 标签内,起到 唯一标识作用 的是这三个标签的组合(相当于位置坐标):
groupId:通常充当文件系统Java包的分组标识;artifactId:项目的名称标识;version:构件当前的版本号。带SNAPSHOT后缀标识的表明该构件还处于开发模式,尚未对外发布。
其他常见的标签还有 <modelVersion>,它是 POM 模型的版本号,一般为 4.0.0;以及 <dependencies> 标签,用于描述项目需要的所有依赖包。
此外也可以在 <project> 标签下补充其他增强项目元信息的标签,例如 developers、description、organization、inceptionYear 等:
xml
<developers>
<developer>
<name>Catalin Tudose</name>
<id>ctudose</id>
<organization>Manning</organization>
<roles>
<role>Java Developer</role>
</roles>
</developer>
<!-- snip -->
</developers>
<description>
"JUnit in Action III" book, the sample project for the "Running JUnit
tests from Maven" chapter.
</description>
<organization>
<name>Manning Publications</name>
<url>http://manning.com/</url>
</organization>
<inceptionYear>2019</inceptionYear>
这些补充内容不仅能让 pom.xml 更加完善,后期构件项目网站时也会包含这些关键信息。
POM 标签不是完全自定义的
Maven的POM规范定义了一系列标准元素,不是完全自定义的。通常是为后期发布该构件设计,以便在发布后联系到相关维护人员。常见的选填标签有:
项目基本信息:
xml<name>maven-sampling</name> <description>项目描述信息</description> <url>http://www.example.com</url>项目组织信息:
xml<organization> <name>公司/组织名称</name> <url>组织官网</url> </organization>开发者信息:
xml<developers> <developer> <id>developer-id</id> <name>开发者姓名</name> <email>email@example.com</email> <url>http://developer-website.com</url> <organization>所属组织</organization> <organizationUrl>组织网址</organizationUrl> <roles> <role>architect</role> <role>developer</role> </roles> <timezone>+8</timezone> </developer> </developers>项目许可信息:
xml<licenses> <license> <name>Apache License, Version 2.0</name> <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url> <distribution>repo</distribution> </license> </licenses>源码管理相关:
xml<scm> <connection>scm:git:https://github.com/username/repo.git</connection> <developerConnection>scm:git:https://github.com/username/repo.git</developerConnection> <url>https://github.com/username/repo</url> </scm>问题追踪系统:
xml<issueManagement> <system>GitHub Issues</system> <url>https://github.com/username/repo/issues</url> </issueManagement>
(未完待续)