Mock:
关注行为验证。细粒度的测试,即代码的逻辑,多数情况下用于单元测试。
何时使用Mock:
- 真实对象的行为具有不确定性。
- 真实对象难以创建。
- 真实对象的行为难以模拟(例如网络错误)。
- 真实对象运行效率很低。
- 真实对象有或者是UI。
- 测试需要得到某个对象列表,但是真实对象必须在某种环境下才能提供。
- 真实对象还没实现。
Mock的优点:
- 运行速度快,测试覆盖率高,容易实现且可以形成良好的测试文档。
Mock的缺点:
- 不是银弹,对于集成测试等粗粒度且耗时的测试不太适用。
Stub:
关注状态验证。粗粒度的测试,在某个依赖系统不存在或者还没实现或者难以测试的情况下使用,例如访问文件系统,数据库连接,远程协议等。
何时用Stub:
需要用到Mock或者Stub的情况,往往是测试的代码存在依赖,当这种依赖难以实现或者不稳定的时候可以考虑使用Stub策略,例如,需要测试的系统,可能需要访问数据库,依赖于运行环境(安全性,存储,Web Service),或者需要访问远程文件系统,访问远程协议(HTTP,SOAP)等。
由于现存的应用的太复杂或者过于脆弱,修改它需要大量的人天。诸如不同系统之间的集成测试,类属于粗粒度的测试皆可考虑使用Stub。
Stub的优点:
Stub的缺点:
- Stub往往比较复杂难以实现,而且需要经常性的调试它。
- 由于Stub模拟的都是难以测试的环境依赖,其复杂性导致它难以维护。
- 实现Stub并不能提供细粒度的单元测试。
- 不同的情况需要不同的Stub实现策略。