Skip to content
🔗 分享本题
查看我的学习进度 →

28 模块 Q4 教学图:mock、stub、fake、spy 的区别?什么时候用哪个?(必考)

🧠 图解记忆:先明确要控制返回、替代实现还是观察交互,再选择测试替身;点击图片可查看原图。

> 就是开场那道题,必须能脱口而出。
替身行为典型用途
stub(桩)只返回预设结果,不记录调用把外部依赖换成固定答案
fake(替身)有真实逻辑的简化实现(内存版数据库、假 HTTP 服务),行为接近真实模拟真实行为
mock(模拟)stub + 验证,能断言"这个方法被调用了几次、传了什么参数"验证调用关系
spy(间谍)包装真实对象,记录调用但不替换逻辑在真实对象上做观察

选型口诀:

  • 只想要固定返回值 → stub
  • 要验证"调没调、调了几次、传了什么参数" → mock
  • 要模拟真实行为 → fake
  • 要在真实对象上做观察 → spy

工程取舍: mock 过多会把测试绑死在实现细节上(重构时测试跟着碎),倾向"接口 + fake";但需要验证时序/调用次数时 mock 不可替代。原则:能 fake 不 mock,能 stub 不 mock。

常见追问: 什么时候 mock 会害了你?(接口变动频繁、过度验证内部实现导致重构成本高、测试与实现强耦合)


📚 参考:Martin Fowler:Mocks Aren't Stubs(mock/stub/fake 区分)