源本科技 | 码上会

使用 JUnit

2026/03/31
5
0

引言

JUnit 是 Java 生态中最主流、最常用的单元测试框架,专门用于 Java 应用的单元测试。它帮助开发者对代码的最小独立单元 / 组件进行自动化测试,确保代码逻辑符合预期、功能正常运行。JUnit 广泛搭配 Spring Boot 等主流框架使用,是开发阶段验证应用功能的核心工具。

核心价值:

  • 用于编写、运行 Java 应用的自动化单元测试

  • 尽早发现代码缺陷,降低修复成本,提升代码质量

  • 提供 @Test@BeforeEach@AfterEach 等注解,极简控制测试执行流程


基础概念

测试用例

测试用例是针对单一代码逻辑编写的最小测试单元。在 JUnit 中,测试用例就是测试类中被注解标记的方法

注解

JUnit 通过注解定义测试规则、控制测试生命周期

JUnit 4

  • @Test:标记方法为测试方法

  • @Before:每个测试方法执行前运行

  • @After:每个测试方法执行后运行

  • @BeforeClass:测试类所有方法执行前仅运行 1 次(必须是静态方法)

  • @AfterClass:测试类所有方法执行后仅运行 1 次(必须是静态方法)

JUnit 5(推荐)

  • @Test:标记测试方法

  • @BeforeEach:每个测试方法执行前运行

  • @AfterEach:每个测试方法执行后运行

  • @BeforeAll:所有测试方法执行前仅运行 1 次

  • @AfterAll:所有测试方法执行后仅运行 1 次

  • @Disabled:禁用测试方法 / 类

  • @DisplayName:自定义测试名称(可读性更强)

断言

断言是 JUnit 的核心验证工具,用于判断实际运行结果预期结果是否一致,测试不通过则直接抛出异常。 常用基础断言:

  • assertEquals():验证两个值相等

  • assertTrue():验证条件结果为 true

  • assertNotNull():验证对象不为 null


运行示例

需要测试的类

/**
 * 业务逻辑类:计算器(待测试的核心代码)
 */
public class Calculator {
    // 加法方法
    public int add(int a, int b) {
        return a + b;
    }
}

JUnit 测试类

import org.junit.Assert;
import org.junit.Test;

/**
 * 计算器的单元测试类
 * 命名规范:业务类名 + Test
 */
public class CalculatorTest {

    /**
     * 测试加法功能
     * @Test 标记该方法为测试用例
     */
    @Test
    public void testAddition() {
        // 1. 创建测试对象
        Calculator calculator = new Calculator();
        // 2. 调用待测试的业务方法
        int result = calculator.add(2, 3);
        // 3. 断言验证:预期结果=5,实际结果=result
        Assert.assertEquals(5, result);
    }
}

代码解析

  • import org.junit.Assert:导入 JUnit 断言工具类

  • import org.junit.Test:导入测试方法注解

  • @Test:将普通方法标记为测试用例

  • 断言语句:测试的核心逻辑,不满足条件则测试失败


什么是单元测试

单元测试是一种软件测试技术,将应用拆分为最小可测试单元(通常是单个方法、函数或类),独立、隔离地测试每个单元的功能。 核心目标:在代码集成到整体项目前,验证每个单元的逻辑正确性,从源头避免缺陷扩散。


JUnit 优势

  1. 自动化执行:支持一键重复运行测试,无需人工干预

  2. 缺陷前置发现:开发阶段即可定位 bug,大幅降低修复成本

  3. 支持 TDD 开发:适配测试驱动开发(先写测试,后写业务代码)

  4. 语法极简:注解化编程,学习成本极低

  5. 断言体系完善:提供丰富的结果验证方法

JUnit 局限性

  1. 语言专属:仅支持 Java 及 JVM 语言(Kotlin/Scala)

  2. 测试范围有限:无法直接测试 UI 界面、复杂数据库交互

  3. 依赖扩展库:模拟外部依赖(接口、数据库)需搭配 Mockito 等框架

  4. 遗留代码成本高:为老旧无测试的代码编写单元测试耗时较长

JUnit 应用场景

  1. 单元测试:测试独立方法 / 类,保证基础逻辑正确性

  2. 测试驱动开发(TDD):TDD 开发模式的核心工具

  3. 持续集成(CI):集成 Jenkins/GitHub Actions 流水线,自动化测试

  4. 集成测试:配合 Mock、TestContainers 等库,扩展为集成测试


其他补充

JUnit 5 测试示例

企业标准写法

import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;

class CalculatorTest {
    private Calculator calculator;

    // 所有测试执行前运行1次
    @BeforeAll
    static void beforeAllTest() {
        System.out.println("=== 开始执行所有测试 ===");
    }

    // 每个测试前初始化对象
    @BeforeEach
    void init() {
        calculator = new Calculator();
    }

    // 自定义测试名称,验证加法
    @Test
    @DisplayName("测试 2 + 3 = 5")
    void testAdd() {
        assertEquals(5, calculator.add(2, 3));
    }

    // 验证异常(核心高级功能)
    @Test
    @DisplayName("测试除数为0抛出异常")
    void testDivideError() {
        assertThrows(ArithmeticException.class, () -> calculator.divide(10, 0));
    }

    // 所有测试执行后运行1次
    @AfterAll
    static void afterAllTest() {
        System.out.println("=== 所有测试执行完毕 ===");
    }
}

项目依赖配置

JUnit 必须引入依赖才能使用,以下是 JUnit 5 最新依赖

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

高频高级断言

  • assertNotEquals():验证值不相等

  • assertFalse():验证条件为 false

  • assertNull():验证对象为 null

  • assertThrows():验证方法抛出指定异常

  • assertAll():组合断言,所有条件都满足才通过测试

最佳实践

  1. 测试类 / 方法命名规范:业务类名+Testtest+功能名

  2. 单元测试必须隔离:不依赖外部环境(数据库、网络)

  3. 一个测试方法只验证一个逻辑

  4. JUnit + Mockito 是 Java 测试的标准组合


总结

  1. JUnit 是 Java 必备单元测试框架,JUnit 5 是当前主流版本

  2. 核心三要素:测试用例(@Test)、生命周期注解断言

  3. 单元测试的核心是隔离测试最小代码单元,提前发现缺陷

  4. 实际开发中,JUnit 需配合 Mockito 完成复杂场景测试