一、单元测试的技术组成(核心视角)
一个完整的单元测试 = 测试运行器 + Mock 机制 + 断言机制
| 角色 | 作用 | 典型代表 |
|---|---|---|
| **测试框架(Runner)** | 发现、执行测试用例 | JUnit 4 / JUnit 5 / TestNG |
| **断言框架(Assertions)** | 判断"对不对" | JUnit Assert / AssertJ / Hamcrest / Truth / TestNG |
| Mock 框架 | 构造依赖、隔离被测对象 | Mockito / EasyMock / PowerMock |
JUnit 本质是 测试运行平台,只是顺带提供了断言能力。
二、为什么需要这种细分?
断言框架只关心一件事:结果是否正确
assertEquals(3, result);
assertThat(result).isEqualTo(3);
职责:
-
比较实际值和期望值
-
提供清晰的错误信息
-
不参与对象创建、依赖管理
这是"验证层"
Mock 框架只关心一件事:环境是否可控
UserService userService = mock(UserService.class);
when(userService.find(1)).thenReturn(new User("Tom"));
职责:
-
替换真实依赖
-
控制返回值
-
验证调用行为
这是"准备层"
三、现实中的组合方式(非常重要)
最主流组合(Spring Boot 标配)
JUnit 5 (跑测试)
+ Mockito(造依赖)
+ AssertJ(写断言)
老一代经典组合
JUnit 4
+ Mockito
+ Hamcrest
Google / Android
JUnit 4/5
+ Mockito
+ Truth