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

原文链接

https://www.methodsandtools.com/archive/archive.php?id=122

posted @   rxh1999  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2020-02-08 [UE4]SetActorRotation & AddActorLocalRotation
点击右上角即可分享
微信分享提示