🧠 图解记忆:先明确要控制返回、替代实现还是观察交互,再选择测试替身;点击图片可查看原图。
> 就是开场那道题,必须能脱口而出。| 替身 | 行为 | 典型用途 |
|---|---|---|
| stub(桩) | 只返回预设结果,不记录调用 | 把外部依赖换成固定答案 |
| fake(替身) | 有真实逻辑的简化实现(内存版数据库、假 HTTP 服务),行为接近真实 | 模拟真实行为 |
| mock(模拟) | stub + 验证,能断言"这个方法被调用了几次、传了什么参数" | 验证调用关系 |
| spy(间谍) | 包装真实对象,记录调用但不替换逻辑 | 在真实对象上做观察 |
选型口诀:
- 只想要固定返回值 → stub
- 要验证"调没调、调了几次、传了什么参数" → mock
- 要模拟真实行为 → fake
- 要在真实对象上做观察 → spy
工程取舍: mock 过多会把测试绑死在实现细节上(重构时测试跟着碎),倾向"接口 + fake";但需要验证时序/调用次数时 mock 不可替代。原则:能 fake 不 mock,能 stub 不 mock。
常见追问: 什么时候 mock 会害了你?(接口变动频繁、过度验证内部实现导致重构成本高、测试与实现强耦合)
