• 为什么需要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. MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码)

    MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...

  2. REST ful

    前后端分离.面向资源.无状态: 请求包含全部信息. 什么是 REST? 下面六条准则定义了一个 REST 系统的特征: 客户-服务器(Client-Server),提供服务的服务器和使用服务的客户需要 ...

  3. url 传参数时出现中文乱码

    1.前端通过 url 传递参数,但是参数又有中文,在下一个页面接受参数的时候中文会乱码 解决方案为: 定义和用法 decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解 ...

  4. 验证:java 主线程在子线程结束后才会结束

    package com.idealisan.test; /** * Hello world! * */ public class App { public static void main( Stri ...

  5. LA 3363

    Run Length Encoding(RLE) is a simple form of compression. RLE consists of the process for searching ...

  6. USACO 4.1 Fence Loops

    Fence Loops The fences that surround Farmer Brown's collection of pastures have gotten out of contro ...

  7. 终于等到你!微软正式上线 Windows Terminal 预览版

    前一段时间,一直在知乎.技术社区收到技术小伙伴们的终极拷问:微软Build 大会上提到的**6月中旬**要上Windows store 的 Windows Terminal 到底啥时候可以用到呀? 有 ...

  8. php第十一节课

    增删改查 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  9. 洛谷P1101 单词方阵【DFS】

    给一n \times nn×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向 ...

  10. python-写入csv 文件

    项目要做一个导出客户信息的功能,需要写入csv: 注意文件写入的方式  例如   write open(‘w’) 从头开始写,之前写的会被替换  write open(‘a’) 则代表追加,文件指针放 ...