The Art of Mocking in Software Testing
在编写单元测试的时候,外部依赖和复杂类的实例化是一大阻碍,Mocking就是为了解决这种阻碍。
mock也有test double, stub, fake等其他叫法。
一个Stub是一个被用来代替真实组件的对象,代替后,真实组件的功能不会被调用。(A Stub is an object that is used to replace a real component without calling any of the real component functionality.)
一个Mock对象是一个Stub,但是它同时也能够验证特定的方法是否被调用。(A Mock objects is a stub that is also used as an observer point for the test. Using a Mock object, a test can verify that a specific method was called, and can use this information as a pass/fail criterion.
)
以下我们统一叫做fake objects,这种差异虽然存在,但是在现代测试框架中,变得微乎其微,不值得过分关注。
首先,什么是单元测试?
单元测试应当是简短,快速,自动执行的。
为什么hand-rolled fakes is not enough
- 为interface添加一个新方法时,所有fake都要实现这个方法。
- 实现一个fake基类可以解决上述问题,但是未重写的方法可能对派生类的行为造成意外影响。
- fake会随着系统功能增加而越来越复杂
以上原因导致了mock framework的出现
Mock Frameworks
主要的实现方式有:
- 在运行时创建fake object
- 编译时创建需要的代码
- 使用method interception将方法调用转发到fake object
实现方式的不同决定了框架所能提供的功能,比如,run-time创建fake object的方式无法mock静态方法和不能被派生的类。
Mock Framework能做什么
主要提供三个功能:
- 创建fake objects
- 为fake objects设置行为
- 验证方法是否被调用
最佳实践和常见陷阱
- 区分tested object和dependency,通常不应该mock tested object
- 非必要,不mock
- fake the immediate neighbors, mock掉被tested object直接调用的类
- 不要滥用Verify,A是否调用了B在大多数时间都不重要,除非Verify是唯一的criteria, 否则不要使用
- 每个test只包含一到两个assertion
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-02-08 [UE4]SetActorRotation & AddActorLocalRotation