JUnit 是 Java 生态中最主流、最常用的单元测试框架,专门用于 Java 应用的单元测试。它帮助开发者对代码的最小独立单元 / 组件进行自动化测试,确保代码逻辑符合预期、功能正常运行。JUnit 广泛搭配 Spring Boot 等主流框架使用,是开发阶段验证应用功能的核心工具。
核心价值:
用于编写、运行 Java 应用的自动化单元测试
尽早发现代码缺陷,降低修复成本,提升代码质量
提供 @Test、@BeforeEach、@AfterEach 等注解,极简控制测试执行流程
测试用例是针对单一代码逻辑编写的最小测试单元。在 JUnit 中,测试用例就是测试类中被注解标记的方法。
JUnit 通过注解定义测试规则、控制测试生命周期
@Test:标记方法为测试方法
@Before:每个测试方法执行前运行
@After:每个测试方法执行后运行
@BeforeClass:测试类所有方法执行前仅运行 1 次(必须是静态方法)
@AfterClass:测试类所有方法执行后仅运行 1 次(必须是静态方法)
@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;
}
}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:将普通方法标记为测试用例
断言语句:测试的核心逻辑,不满足条件则测试失败
单元测试是一种软件测试技术,将应用拆分为最小可测试单元(通常是单个方法、函数或类),独立、隔离地测试每个单元的功能。 核心目标:在代码集成到整体项目前,验证每个单元的逻辑正确性,从源头避免缺陷扩散。
自动化执行:支持一键重复运行测试,无需人工干预
缺陷前置发现:开发阶段即可定位 bug,大幅降低修复成本
支持 TDD 开发:适配测试驱动开发(先写测试,后写业务代码)
语法极简:注解化编程,学习成本极低
断言体系完善:提供丰富的结果验证方法
语言专属:仅支持 Java 及 JVM 语言(Kotlin/Scala)
测试范围有限:无法直接测试 UI 界面、复杂数据库交互
依赖扩展库:模拟外部依赖(接口、数据库)需搭配 Mockito 等框架
遗留代码成本高:为老旧无测试的代码编写单元测试耗时较长
单元测试:测试独立方法 / 类,保证基础逻辑正确性
测试驱动开发(TDD):TDD 开发模式的核心工具
持续集成(CI):集成 Jenkins/GitHub Actions 流水线,自动化测试
集成测试:配合 Mock、TestContainers 等库,扩展为集成测试
企业标准写法
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():组合断言,所有条件都满足才通过测试
测试类 / 方法命名规范:业务类名+Test、test+功能名
单元测试必须隔离:不依赖外部环境(数据库、网络)
一个测试方法只验证一个逻辑
JUnit + Mockito 是 Java 测试的标准组合
JUnit 是 Java 必备单元测试框架,JUnit 5 是当前主流版本
核心三要素:测试用例(@Test)、生命周期注解、断言
单元测试的核心是隔离测试最小代码单元,提前发现缺陷
实际开发中,JUnit 需配合 Mockito 完成复杂场景测试