
JUnit 是 Java 领域最流行的单元测试框架,用于编写和运行可重复的测试,帮助开发者验证代码的正确性。它支持自动化测试、测试用例组织、测试结果断言等功能,是敏捷开发和持续集成中的核心工具。
@Test )标记测试方法,简化测试代码编写。@BeforeEach 、@AfterEach 等注解控制测试方法的执行时机。| 注解 | 作用 |
|---|---|
@Test |
标记一个测试方法 |
@BeforeEach |
每个测试方法执行前运行(初始化资源) |
@AfterEach |
每个测试方法执行后运行(释放资源) |
@BeforeAll |
所有测试方法执行前运行(静态方法) |
@AfterAll |
所有测试方法执行后运行(静态方法) |
@Disabled |
禁用某个测试方法或类 |
@DisplayName |
为测试方法或类设置可读性名称 |
@ParameterizedTest |
参数化测试,支持多组输入数据 |
org.junit.jupiter.api.Assertions)断言方法用于验证代码执行结果是否符合预期,若断言失败则测试用例报错。
基础断言
assertEquals(expected,actual):验证两个值相等(支持所有基本类型、对象、集合等)。assertEquals(4,2 + 2); // 成功
assertEquals("hello", "hel" + "lo"); // 成功
assertNotEquals(unexpected,actual):验证两个值不相等。 assertTrue(condition):验证条件为 true。assertTrue(list.isEmpty()); // 验证集合为空
assertFalse(condition):验证条件为 false。 assertNull(actual):验证对象为 null。 assertNotNull(actual):验证对象不为 null。数组/集合断言
assertArrayEquals(expectedArray,actualArray):验证两个数组内容相等。int[] expected = {1,2,3};
int[] actual = {1,2,3};
assertArrayEquals(expected,actual); // 成功
assertEquals(需集合实现 equals 方法,如 List、Set)。List<Integer> expected = Arrays.asList(1,2,3);
List<Integer> actual = Arrays.asList(1,2,3);
assertEquals(expected,actual); // 成功
异常断言
assertThrows(expectedException,executable):验证执行代码时抛出指定异常。// 验证空指针异常
assertThrows(NullPointerException.class, () -> {
String str = null;
str.length();
});
超时断言
assertTimeout(duration,executable):验证代码在指定时间内执行完成。// 验证代码在 1 秒内执行完
assertTimeout(Duration.ofSeconds(1), () -> {
Thread.sleep(500); // 执行耗时 500ms,成功
});
自定义错误信息
所有断言方法都支持最后添加一个字符串参数,作为断言失败时的提示信息:
assertEquals(4,2 + 1, "2+1 的结果应该是 3,但实际计算错误");
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
private Calculator calc = new Calculator();
@Test
@DisplayName("测试加法运算")
void testAdd() {
int result = calc.add(2,3);
assertEquals(5,result, "2+3 应该等于 5");
}
@Test
@DisplayName("测试除法异常")
void testDivideByZero() {
assertThrows(ArithmeticException.class, () -> {
calc.divide(10,0);
}, "除以 0 应该抛出算术异常");
}
}
JUnit 框架通过注解和断言机制,让开发者能够快速编写可靠的单元测试。合理使用断言方法可以覆盖各种测试场景(正常逻辑、边界条件、异常情况等),确保代码在修改或重构后仍能保持正确性。对于复杂测试场景,还可以结合参数化测试(@ParameterizedTest)、测试套件等高级功能。