开发基础知识 - JUnit 5
Introduction
一个简单的例子:
1 |
|
注解
@Test
它声明了一个方法是一个标准的测试方法。方法应该是 void 类型,方法不应该是 private 的,JUnit 会自动创建测试类的实例来运行这些方法。@BeforeEach & @AfterEach
这两个注解用于在每个 @Test 方法执行前后设置和清理环境。这对于确保测试之间的独立性至关重要。@BeforeAll & @AfterAll
这两个注解在当前测试类的所有测试方法运行前后只执行一次。@DisplayName
默认情况下,测试报告会显示方法名。@DisplayName 允许你提供一个更具描述性的自定义名称。
比如:@DisplayName("用户名和密码正确时应认证成功")
断言
位于 org.junit.jupiter.api.Assertions
下。
- assertEquals(expected, actual)
- assertNotEquals(unexpected, actual)
- assertTrue(boolean condition)
- assertNull(Object actual)
- assertArrayEquals(expectedArray, actualArray)
- assertThrows(expectedType, executable)
1
2
3
4
5
6
7
8@Test
void testDivisionByZero() {
Calculator calculator = new Calculator();
// 验证当除数为0时,是否会抛出 ArithmeticException 异常
assertThrows(ArithmeticException.class, () -> {
calculator.divide(1, 0);
});
}
Mockito
为什么需要 Mocking
单元测试强调 隔离性。当你测试一个类 A 时,如果它依赖于另一个复杂的类 B(例如,B 可能需要访问数据库、调用网络接口),你不希望因为 B 的问题(如数据库连接失败)导致 A 的测试失败。
Mocking 技术就是为了解决这个问题。它允许你创建一个 Mock 对象,你可以指定它的方法被调用时应该返回什么值或执行什么操作,从而将测试目标从其依赖项中隔离开来。
Mock
1 |
|
1 |
|
Spy
Mock:当你创建一个 Mock 对象时,你创建的是一个目标类的“空壳子”。调用 Mock 对象的任何方法,除非你用
when(...).thenReturn(...)
对其行为进行了stubbing,否则它只会返回该方法返回类型的默认值(null、0、false、空集合等)。Spy:当你创建一个 Spy 对象时,你实际上是创建了一个真实的对象实例。调用 Spy 对象的任何方法,默认会直接调用真实对象的原始方法,并返回真实的结果。
1 |
|
when(spy.method()).thenReturn(...)
的形式会先执行真实的方法。doReturn/doThrow/doAnswer
避免执行真实方法带来的副作用。
开发基础知识 - JUnit 5
https://thiefcat.github.io/2025/08/10/SWE-basic/tools/junit/