JUnit 概述:从历史到实战

说到单元测试,Java 圈子里没人不知道 JUnit。我最早接触的是 JUnit 3,那时候写测试还得继承 TestCase,方法名必须以 test 开头——稍不留神就漏了。后来 JUnit 4 引入注解,清爽多了。到了 JUnit 5,整个架构都重新设计了,可以说是脱胎换骨。

这一章我们不聊太虚的,直接说清楚三件事:JUnit 怎么一路走来的,JUnit 5 到底比 4 强在哪,以及怎么在你的项目里把环境搭起来。

JUnit 概述 · 知识体系 JUnit 发展历程 JUnit 3 (继承 TestCase) JUnit 4 (注解驱动) JUnit 5 (全新架构) JUnit 5 三大组件 Jupiter (新注解 + API) Platform (测试引擎) Vintage (兼容 JUnit 4) 驱动 环境搭建 Maven / Gradle 依赖 IDE 配置 (IntelliJ / Eclipse) 落地实践 提示:JUnit 5 架构将测试定义(Jupiter)、运行平台(Platform)、向后兼容(Vintage)三者分离,清晰且可扩展。

JUnit 发展历程:三个时代的跨越

JUnit 最早是 Erich Gamma 和 Kent Beck 搞出来的,那时候还是 JUnit 3。说真的,用起来挺麻烦的——必须继承 TestCase,方法名必须是 testXxx,断言也是老一套。后来 JUnit 4 引入了注解,比如 @Test、@Before,一下子清爽多了。

JUnit 5 是在 2017 年推出的,完全是一次重写。它不再是一个单独的 jar 包,而是拆成了三个子项目:

组件说明
JUnit Platform测试引擎的启动入口,可以在 IDE、构建工具、控制台里运行
JUnit Jupiter全新的编程模型,包含新的注解和断言 API
JUnit Vintage向后兼容,让你在 JUnit 5 上跑 JUnit 3/4 的测试

我曾经从 JUnit 4 迁移到 5,最头疼的就是老测试能不能继续用。还好有 Vintage 模块,直接把老的测试迁移过来,只需要改一下依赖,基本零成本。

JUnit 5 vs JUnit 4:核心差异

你可能会问:「都 2025 年了,JUnit 4 还能用吗?」能用,但我建议新项目直接上 JUnit 5。说白了,JUnit 4 能干的 JUnit 5 都能干,而且干得更好。下面这张表对比了主要差异:

特性JUnit 4JUnit 5 (Jupiter)
核心注解@Test@Test(来自 org.junit.jupiter.api)
生命周期@BeforeClass / @Before@BeforeAll / @BeforeEach
断言Assert.assertEqualsassertEquals(静态导入,更丰富)
参数化测试@Parameters(需要 Runner)@ParameterizedTest(原生支持)
扩展机制@RunWith@ExtendWith + Extension 接口
Java 版本要求Java 5+Java 8+

重点记住: JUnit 5 的 @Test、@BeforeEach 等注解都位于 org.junit.jupiter.api 包下,不要和 JUnit 4 的 org.junit 搞混了。一开始我就在这踩过坑——明明写了 @Test,结果导错包,注解没用上,测试跑都没跑。

搭建 JUnit 5 测试环境

环境搭建其实就两件事:加依赖,配 IDE。我们先说 Maven 和 Gradle 的配置。

Maven 配置

在 pom.xml 中添加如下依赖。注意 junit-jupiter 是一个聚合依赖,它会自动拉取 junit-jupiter-api、junit-jupiter-engine 和 junit-jupiter-params:

<!-- JUnit 5 核心依赖 -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.11.0</version>
    <scope>test</scope>
</dependency>

<!-- 如果还需要跑 JUnit 4 的老测试,加上 Vintage -->
<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <version>5.11.0</version>
    <scope>test</scope>
</dependency>

Gradle 配置

Gradle 用户更简单,在 build.gradle 中:

test {
    useJUnitPlatform()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0'
    // 如果需要 JUnit 4 兼容
    testImplementation 'org.junit.vintage:junit-vintage-engine:5.11.0'
}

IDE 配置(IntelliJ IDEA 为例)

现在的 IntelliJ IDEA 2023+ 版本已经内置了 JUnit 5 支持。你只需要:

  • 确认项目的 File → Project Structure → Modules → Dependencies 里能看到上面添加的 JUnit 5 依赖
  • 在测试类上右键 → Run '类名',IDE 会自动识别 @Test 注解并启动 JUnit Platform

小技巧: 我第一次搭环境时,发现测试怎么都跑不起来,报 No tests found。检查了半天,原来是 test scope 没加,依赖没被 IDE 下载。你可以在 Maven 侧边栏里点一下「Reimport」,或者用 mvn dependency:tree 看看依赖是不是真的拉下来了。

写一个最简单的测试验证环境

环境搭好了,总得跑一下试试。创建一个测试类:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class FirstTest {

    @Test
    void shouldPass() {
        int result = 1 + 1;
        assertEquals(2, result, "1+1 应该等于 2");
    }
}

右键运行,如果看到绿色勾,说明环境没问题。我这里随手写了一个小测试,用来验证 JUnit 5 能正常工作。接下来你就可以正式开始编写单元测试了。

注意: 请使用 @Test 来自 org.junit.jupiter.api,不是 org.junit。如果误导了 JUnit 4 的注解,测试不会执行,而且不报错。我就犯过这种乌龙——盯着屏幕看了十分钟,才意识到导错了包。

好,JUnit 的来龙去脉和环境搭建就聊到这里。后面我们会深入 JUnit 5 的各种测试技巧,结合 Mockito 做真正的实战。现在你已经迈出了第一步,可以放心地往下跑了。