• 为什么需要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. NET MVC FileResult 导出/下载 文件/Excel

    参考http://www.cnblogs.com/ldp615/archive/2010/09/17/asp-net-mvc-file-result.html 1.引入NPOI 2.代码 using ...

  2. dataGridView 设置

    //窗体加载事件 //内容居中 dataGridView1.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCe ...

  3. Java+selenium+Firefox/ IE/ Chrome主流浏览器自动化环境搭建

    一.java+selenium+firefox 1.环境准备:JDK1.8 2.安装firefox浏览器v59 3.下载驱动:https://github.com/mozilla/geckodrive ...

  4. 1.1、配置Python虚拟环境

    安装虚拟环境 系统:CentOS 7.2 python版本:Python 2.7.5 1.虚拟环境介绍 虚拟环境是Python解释器的一个私有副本,在这个环境中你可以安装私有包,而且不会影响系统中安装 ...

  5. 企业版 Linux 附加软件包(EPEL)

    企业版 Linux 附加软件包(以下简称 EPEL)是一个由特别兴趣小组创建.维护并管理的,针对 红帽企业版 Linux(RHEL)及其衍生发行版(比如 CentOS.Scientific Linux ...

  6. 面试官问你如何解决web高并发这样回答就好了

    所谓高并发,就是同一时间有很多流量(通常指用户)访问程序的接口.页面及其他资源,解决高并发就是当流量峰值到来时保证程序的稳定性. 我们一般用QPS(每秒查询数,又叫每秒请求数)来衡量程序的综合性能,数 ...

  7. Git 基础教程 之 分支管理及策略

    创建一个属于自己的分支,别人看不到,你在你自己的分支上干活, 想提交就提交,直至开发完毕后,再一次性合并到原来分支上.这样,既安全,又不影响他人工作.          在实际的开发过程中,应照几个基 ...

  8. Codeforces 902B - Coloring a Tree

    传送门:http://codeforces.com/contest/902/problem/B 本题是一个关于“树”的问题. 有一棵n个结点的有根树,结点按照1~n编号,根结点为1.cv为结点v的色号 ...

  9. BZOJ 3329 Xorequ (数位DP、矩阵乘法)

    手动博客搬家: 本文发表于20181105 23:18:54, 原地址https://blog.csdn.net/suncongbo/article/details/83758728 题目链接 htt ...

  10. Oracle关联查询-数据类型不一致问题 ORA-01722: 无效数字

    一.存在表A和表B,都包含字段user_no,但数据类型不一致,如下: create table A ( user_id varchar2(20), user_no number(12,0), xxx ...