• 为什么需要Mock.

    • 真实对象具有不确定的行为.所以会产生不可预测的结果.
    • 真实对象很难被创建.
    • 真实对象的某些行为很难被触发(如网络错误).
    • 真实对象令程序的运行速度很慢.
    • 真实对象有(或者是)用户界面.
    • 测试需要询问真实对象它是如何被调用的.
    • 真实对象实际上并不存在.例如其它小组开发的模块.
  • 使用Mock的3个步骤
    • 使用一个接口来描述该对象.
    • 为产品代码实现该接口.
    • 以测试为目的,在Mock对象中实现该接口.
  • Test Double
    • Dummy.被传递但是从不被实际使用的对象.通常用于填充参数列表.
    • Fake.含有实际实现的对象.但通常使用一些不适用于实际项目的捷径(内存数据库).
    • Stubs.对调用提供一些预设的响应.通常不会调用代码中实际调用会执行的代码.可以用来记录关于调用的信息.(Email中可以记录发送过的邮件).
    • Mocks.预先编写的对象.接受特殊的调用,返回特定的预期行为.
    • Mock的四个步骤:setup,exercise,verify,teardown.
    • 只有Mock是进行行为测试验证.
  • 主要对象和次要对象
    • 单元测试中,我们通常关注的是主要测试对象的功能和行为.
    • 对于主要测试对象涉及到的次要对象尤其是一些依赖,我们仅仅关注主要测试对象和次要测试对象的交互.
    • 比如是否调用,何时调用,调用的参数,调用的次序,以及返回的结果或者异常等.
    • 但是次要对象是如何执行这次调用的,并不关心.
    • 因此,使用mock对象或者stub对象来替代真实的次要对象,从而模拟真实场景来进行对主要测试对象的测试.
  • 测试工具
    • 在.Net下大部分工具都是使用动态类型来进行Mock,因此,只能Mock接口或者overriable成员.
    • 而TypeMock直接使用inject方式,即使是sealed或者不可覆盖方法也能进行Mock.
    • 通常,如果发现必须要覆盖不可覆盖的方法才能够进行测试,那么很可能是设计问题.
  • Mock行为依赖风险
    • 被模型对象的行为必须与真实对象的行为完全一致.
    • 开发者对API不够了解;被模拟对象的行为发生了改变(重构,添加新功能导致的).都可能引起错误假设(与真实对象行为不一致).错误假设会引入缺陷,并留下非法测试.
    • 非法测试:看起来像测试,运行起来也是测试.但是几乎没有价值,几乎不会失败.
  • Mock的优点
    • Mock对象的行为简单,唯一.一旦设置好setup后总是返回同一值.
    • Mock对象的行为可以预期,如果调用到了不希望调用的方法会让测试失败.若方法被调用了,还可以验证参数.
    • 可以Mock一些在真实环境中难以模拟或者出现的错误或者异常.
    • Mock是一种白盒测试方式.Mock对象的setup过程就是目标代码实现细节的设计过程.
    • 接口为使用者而设计.所以当接口还未被实现时,Mock可以验证使用者是如何使用接口的.
  • Mock的缺陷
    • Mock对象的行为依赖风险.在对真实对象进行重构的时候,容易带来该问题.
    • Mock对象的setup过程可能过于繁重.
      • 另一个角度,过于复杂的Mock对象的setup过程,说明真实对象承担了过多的职责.
      • 分出更多职责清晰的小类,可以避免这种情况.
    • Mock对象的setup过程含有过多的语义.
      • Mock对象的行为定义.调用方法的返回值;调用方法时的Throw Exception;给调用方法时传递的参数发送消息.
      • Test Case期望assert的内容.方法是否被调用以及被调用的次数.调用方法时的参数是否合法.

单元测试之Mock的更多相关文章

  1. python笔记24-unittest单元测试之mock.patch

    前言 上一篇python笔记23-unittest单元测试之mock对mock已经有初步的认识, 本篇继续介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创 ...

  2. python文档2-unittest单元测试之mock.patch

    介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创建模拟并将其传递到装饰函数 patch简介 1.unittest.mock.patch(target,ne ...

  3. CoreCRM 开发实录 —— 单元测试之 Mock UserManager 和 SignInManager

    单元测试的核心就是:只测试眼前的逻辑.这就要求所有的依赖项都要使用仿类来代替,也就是所谓的 Mock Object.在测试 ProfileRepository 和 AccountController ...

  4. python笔记23-unittest单元测试之mock

    什么是mock unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西. 它的主要功能是使用mock对象替代掉指定 ...

  5. python文档1-unittest单元测试之mock

    什么是mock unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西.它的主要功能是使用mock对象替代掉指定的 ...

  6. java单元测试之Mock静态方法

    1 public final class AmountUtil { public static String CustomFormatWith2Digits(int amount) { return ...

  7. 玩转单元测试之Testing Spring MVC Controllers

    玩转单元测试之 Testing Spring MVC Controllers 转载注明出处:http://www.cnblogs.com/wade-xu/p/4311657.html The Spri ...

  8. 玩转单元测试之WireMock -- Web服务模拟器

    玩转单元测试之WireMock -- Web服务模拟器 WireMock 是一个灵活的库用于 Web 服务测试,和其他测试工具不同的是,WireMock 创建一个实际的 HTTP服务器来运行你的 We ...

  9. [转载]单元测试之道(使用NUnit)

    首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而又忐忑的心情点击界面上的 ...

随机推荐

  1. layui confirm

    layer.confirm('是否要删除信息!', { btn: ['确定', '取消'] }, function (index, layero) { //移除元素 $("#tr" ...

  2. 解决postman https请求无返回数据的问题

    1.点击右上角的扳手图标 2.点击settings 3.点击general 4.把 ssl certificate verification这项点击关闭

  3. Spring Cloud Alibaba、Spring Boot、Spring Cloud对应版本关系

    Spring Boot Spring Cloud Spring Cloud Alibaba 2.1.x Greenwich 0.9.x 2.0.x Finchley 0.2.x 1.5.x Edgwa ...

  4. 【剑指Offer】51、构建乘积数组

      题目描述:   给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1].   其中B中的元素B[i]=A[0] * A[1]... * A[i-1] * A[i+1] ...

  5. 配置zabbix及安装agent

    一.配置zabbix http://ip/zabbix/setup.php Next step Next step 输入数据库密码后,Next step Next step 默认用户名是Admin 密 ...

  6. NumPy常见的元素操作函数

    ceil(): 向上最接近的整数,参数是 number 或 array floor(): 向下最接近的整数,参数是 number 或 array rint(): 四舍五入,参数是 number 或 a ...

  7. 11. IDEA 在同一工作空间创建多个项目

    1.创建项目 二..创建工作空间 JavaWorkspace 1.File-> New Project -> 创建工作空间 JavaWorkspace,并 顺便创建项目 JavaOne 2 ...

  8. RMAN主要命令 show,list,crosscheck,delete详解

    Oracle RMAN 的 show,list,crosscheck,delete命令整理  Oracle RMAN 的 show,list,crosscheck,delete命令整理 1.SHOW命 ...

  9. UVA - 348Optimal Array Multiplication Sequence(递推)

    id=19208">题目:Optimal Array Multiplication Sequence 题目大意:给出N个矩阵相乘.求这些矩阵相乘乘法次数最少的顺序. 解题思路:矩阵相乘 ...

  10. 高效使用hive

    工作中常常使用hive.熟练使用hvie的配置參数能够更加高效的使用Hive Hive option: hive -f   script.hql : 从文件script.hql中的读取hql运行 hi ...