背景

本文假设你对TDD、Stub和Mock已经有了初步的认识,本文简单解释一下stub和mock的区别和使用场景,先看看他们之间的关系:

由上图可以知道mock框架可以非常容易的开发stub和mock,但是stub框架想要提高mock机制就要靠自己扩展了。

Stub

stub存在的意图是为了让测试对象可以正常的执行,其实现一般会硬编码一些输入和输出,下面的代码使用了MS自带的Fake和Shim来实现stub。

Fake实现

 using System;
using Microsoft.VisualStudio.TestTools.UnitTesting; using TDDStudy.Library.WhatIsStub;
using TDDStudy.Library.WhatIsStub.Fakes; namespace TDDStudy.WhatIsStub
{
[TestClass]
public class WhatIsStubTest
{
[TestMethod]
public void Stub_Test()
{
var domainService = new DomainService(CreateStubDependencyService());
domainService.Task();
} private IDependencyService CreateStubDependencyService()
{
return new StubIDependencyService
{
OtherTask = () => { }
};
}
}
}

Shim实现

 using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.QualityTools.Testing.Fakes; using TDDStudy.Library.WhatIsShim;
using TDDStudy.Library.WhatIsShim.Fakes; namespace TDDStudy.WhatIsShim
{
[TestClass]
public class WhatIsStubTest
{
[TestMethod]
public void Shim_Test()
{
using (ShimsContext.Create())
{
var domainService = new DomainService(CreateShimDependencyService());
domainService.Task();
}
} private DependencyService CreateShimDependencyService()
{
return new ShimDependencyService
{
OtherTask = () => { }
};
}
}
}

备注:微软的Fake适合接口、保护虚方法的类,Shim适合其它类(封闭的、非虚的)。

Mock

mock除了保证stub的功能之外,还可深入的模拟对象之间的交互方式,如:调用了几次、在某种情况下是否会抛出异常,下面的代码使用了moq来实现mock。

moq实现

 using System;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq;
using TDDStudy.Library.WhatIsMock; namespace TDDStudy.WhatIsMock
{
[TestClass]
public class WhatIsStubTest
{
[TestMethod]
public void Mock_Test()
{
var mock = CreateMockDependencyService(); var domainService = new DomainService(mock.Object);
domainService.Task(); mock.Verify(x => x.OtherTask(), Times.AtMostOnce);
} private Mock<IDependencyService> CreateMockDependencyService()
{
return new Mock<IDependencyService>();
}
}
}

备注:mock是一种功能丰富的stub。

备注

我目前只使用MS的Fake,感觉够了。

TDD:什么是桩(stub)和模拟(mock)?的更多相关文章

  1. fiddler学习总结--利用fiddler快速模拟mock

    Mock的应用就是在测试接口的时候,去模拟我们想要的接口 1.创建一个txt文件,里面随意写一个json字符串,如图所示: 2.选择目标消息,并且点击“autoresponde”-->“add ...

  2. PHPUnit 手册

    PHPUnit 手册 Sebastian Bergmann 版权 © 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 ...

  3. PHPUnit 手册(转)

    PHPUnit 手册 PHPUnit 手册 Sebastian Bergmann 版权 © 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, ...

  4. Mockito 中文文档 ( 2.0.26 beta )

    Mockito 中文文档 ( 2.0.26 beta ) 由于缺乏校对,难免有谬误之处,如果发现任何语句不通顺.翻译错误,都可以在github中的项目提出issue.谢谢~ Mockito框架官方地址 ...

  5. 使用 Mockito 单元测试 – 教程

    tanyuanji@126.com 版本历史 - - - - 使用 Mockito 进行测试 该教程主要讲解 Mockito 框架在Eclipse IDE 中的使用   目录 tanyuanji@12 ...

  6. TDD学习笔记【六】一Unit Test - Stub, Mock, Fake 简介

    这篇文章简介一下,如何通过 mock framework,来辅助我们更便利地模拟目标对象的依赖对象,而不必手工敲堆只为了这次测试而存在的辅助类型. 而模拟目标对象的部分,常见的有 stub objec ...

  7. Stub和Mock的理解

    我对Stub和Mock的理解 介绍 使用测试驱动开发大半年了,我还是对Stub和Mock的认识比较模糊,没有进行系统整理. 今天查阅了相关资料,觉得写得很不错,所以我试图在博文中对资料进行整理一下,再 ...

  8. Mock 模拟测试简介及 Mockito 使用入门

    Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...

  9. [Test] 单元测试艺术(2) 打破依赖,使用模拟对象,桩对象,隔离框架

    在上节中,完成了第一个单元测试,研究了各种特性,在本节,将介绍一些更实际的例子.SUT依赖于一个不可操控的对象,最常见的例子是文件系统,线程,内存和时间等. 本系列将分成3节: 单元测试基础知识 打破 ...

  10. 我对Stub和Mock的理解

    介绍 使用测试驱动开发大半年了,我还是对Stub和Mock的认识比较模糊,没有进行系统整理. 今天查阅了相关资料,觉得写得很不错,所以我试图在博文中对资料进行整理一下,再加上一些自己的观点. 本文是目 ...

随机推荐

  1. leetcode 最大不重复字符

    class Solution: def lengthOfLongestSubstring(self, s: str) -> int: if len(s) <= 1: return len( ...

  2. MongoDB及Mongoose的记录

    MongoDB是一种NoSQL的文档型数据库,其存储的文档类型都是JSON对象. 在node.js中由于代码都是异步执行,且nosql也没有“事物”这一定义,所以日常使用中很难保证数据库操作的原子性. ...

  3. rest接口webservice接口利用http请求方式发送数据

    所需依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>h ...

  4. C# WPF 父控件通过使用可视化树找到子控件

    在我们使用WPF设计前台界面时,经常会重写数据模板,或者把控件放到数据模板里.但是一旦将控件放到数据模板中,在后台就没有办法通过控件的名字来获取它了,更没办法对它进行操作(例如,隐藏,改变控件的某个值 ...

  5. PCL-CMAKELIST书写格式

    cmake_minimum_required(VERSION 2.6 FATAL_ERROR)//cmake最小版本 find_package(PCL 1.3 REQUIRED COMPONENTS ...

  6. eclipse 安装 maven

    一共需要3个步骤,1 安装maven环境   2  安装eclipse的maven插件   3 配置eclipse的maven环境 1. 安装maven环境 1.1  下载    去网址http:// ...

  7. 修改maven的源地址为阿里源

    在放maven的安装文件里,找到settings.xml,如下图所示 将默认的源地址改为阿里源,需要在settings.xml文件相应的位置上加上如下的一串:  <mirror> < ...

  8. 《MySQL必知必会》官方提供的数据库和表

    数据用于配合<MySQL必知必会>(MySQL Crash Course)这本书使用,配套SQL文件也可在Ben Forta网站下载. Ben Forta网址:http://forta.c ...

  9. day32 进程

    上午: # 1 开启子进程 #target #args # if __name__ == '__main__' #start() # 2.其它的方法: #方法: #terminate() #is_al ...

  10. JS-MD5加密

    首先,下载MD5文件压缩包 点击下载MD5压缩包 然后,在需要加密的页面引用MD5脚本文件 <script src="js/md5.js" type="text/j ...