JUnit 5 基础
约 749 字大约 3 分钟
布欧-Lewyon
2026-05-15
JUnit 5 是 Java 生态最主流的单元测试框架。它由三个子项目组成:JUnit Platform(测试引擎启动器)、JUnit Jupiter(新的编程模型)和 JUnit Vintage(兼容 JUnit 4)。
Maven 依赖
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>第一个测试
被测类 Calculator.java:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int divide(int a, int b) {
if (b == 0) {
throw new IllegalArgumentException("除数不能为 0");
}
return a / b;
}
}测试类 CalculatorTest.java(放在 src/test/java 下):
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class CalculatorTest {
private final Calculator calc = new Calculator();
@Test
void testAdd() {
assertEquals(5, calc.add(2, 3));
}
@Test
void testDivide() {
assertEquals(2, calc.divide(6, 3));
}
@Test
void testDivideByZero() {
assertThrows(IllegalArgumentException.class,
() -> calc.divide(1, 0));
}
}- 测试类和测试方法无需
public(JUnit 5 比 JUnit 4 更灵活)。 @Test标记测试方法,方法名可用中文或自然语言描述。
常用断言
assertEquals(expected, actual); // 相等
assertNotEquals(unwanted, actual); // 不等
assertTrue(condition); // 为 true
assertFalse(condition); // 为 false
assertNull(object); // 为 null
assertNotNull(object); // 非 null
assertThrows(ExceptionType, executable); // 期望抛异常
assertDoesNotThrow(executable); // 不抛异常
assertArrayEquals(expected, actual); // 数组相等
assertIterableEquals(expected, actual); // 可迭代表达相等断言可以加失败消息作为最后一个参数(Lambda 形式避免字符串拼接开销):
assertEquals(5, result, () -> "期望 5,实际得到 " + result);生命周期方法
import org.junit.jupiter.api.*;
class LifecycleTest {
@BeforeAll
static void initAll() {
System.out.println("在所有测试方法之前执行(1 次)");
}
@BeforeEach
void init() {
System.out.println("每个测试方法之前执行");
}
@Test
void testOne() {
System.out.println("测试一");
}
@Test
void testTwo() {
System.out.println("测试二");
}
@AfterEach
void tearDown() {
System.out.println("每个测试方法之后执行");
}
@AfterAll
static void tearDownAll() {
System.out.println("在所有测试方法之后执行(1 次)");
}
}@BeforeAll/@AfterAll必须是static方法。@BeforeEach/@AfterEach在每个测试方法前后运行,适合初始化/清理对象。
禁用测试
@Test
@Disabled("待修复——JIRA-1234")
void testNotReady() {
// 此测试暂时跳过
}@Disabled 可加在类级别禁用整个测试类。记得写原因说明。
嵌套测试
用 @Nested 按场景组织测试类层次:
class BankAccountTest {
@Test
void canCreateAccount() { ... }
@Nested
class WhenDepositing {
@BeforeEach
void setUp() { ... }
@Test
void balanceIncreases() { ... }
@Test
void rejectsNegativeAmount() { ... }
}
@Nested
class WhenWithdrawing {
@Test
void balanceDecreases() { ... }
@Test
void throwsWhenInsufficient() { ... }
}
}小结
- JUnit 5 用
@Test标记测试方法,Assertions类提供丰富的断言。 - 生命周期:
@BeforeAll/@AfterAll(类级别,static)和@BeforeEach/@AfterEach(方法级别)。 @Disabled跳过测试,@Nested组织层次化测试结构。- 测试类放在
src/test/java,不要与生产代码混在一起。 - 易错:
assertEquals(a, b)的参数顺序是"期望值,实际值"——顺序颠倒不会影响结果判断,但影响错误消息的可读性。另外,浮点比较应用assertEquals(expected, actual, delta)指定精度。 - 思考任务:为一个
StringUtils类(包含reverse和isPalindrome两个静态方法)编写完整的 JUnit 5 测试,包含正常输入、空串、null 等边界情况。
上一节:Maven 进阶
下一节:参数化测试与 Mock
