单元测试——Moq框架下的Mock简介及简单实例
2015-02-28 23:05
483 查看
1.为什么要用Mock?
在测试过程中,往往会遇到这些问题:(1)真实对象具有不可确定的行为(产生不可预测的结果,如股票行情)。
(2)真实对象很难被创建。
(3)真实对象的某些行为很难触发(如网络错误)。
(4)真实对象令程序的运行速度很慢。
(5)真实对象有(或者是)用户界面。
(6)测试需要询问真实对象它是如何被调用的(例如,测试可能需要验证某个回调函数是否被调用了)。
(7)真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍问题)。
借助于mock对象,我们就可以解决上面提到的所有问题。
2.如何使用Mock?
(1)种种原因,某对象需要暂时用Mock来模拟;(2)使用一个接口来描述这个对象;
(3)以测试为目的,在mock对象中实现这个接口。
3.测试准备:
(1)下载安装NUnit,地址:http://download.csdn.net/detail/wangqingbo0829/8470143【注】Moq解压后,使用NET35文件中的moq.dll。如果不兼容,可换其他版本(NET40、NET40-RequiresCastle)。
(2)向“测试用例项目”中添加两个引用nunit.framework、moq.dll。
4.测试实例:
(一个类中实现加、减、乘、除 四则运算运算;另一个类中进行幂运算,但尚未实现,而使用Mock进行替代。)(1) 源程序 程序中有一个方法(PowerfunctionAction)需要用Mock模拟
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CountFunction { public class Methods { //控制台应用程序,程序入口 static void Main(string[] args) { } //声明接口 private IPowerfunction _actionNum; //无参构造函数 public Methods(){ } //构造函数 public Methods(IPowerfunction actionNum) { //属性 初始化(通过传参 接口 成为 属性成员) this._actionNum = actionNum; } //幂运算(指数为整数) public double PowerfunctionAction(double a, int num) { //通过 成员函数 调用接口 ,其依赖于其他接口实现(假使尚未完成开发) return this._actionNum.PowerfunctionGetValue(a,num); } //……其他函数(方法)实现 #endregion } }
(2) 特殊接口(专为“需要用Mock模拟的方法”写的接口)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CountFunction { /// <summary> /// 幂运算 接口 /// </summary> public interface Ipowerfunction //专为 需用mock替代的对象 写一个接口 { double PowerfunctionGetValue(double a ,int num); } }(3) 测试项目
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NUnit.Framework; using CountFunction; using Moq; namespace CountFunction.Tests { [TestFixture] public class ProgramTester { #region 使用Mock的进行测试 //1. Mock代替 接口IPowerfunction(即 Mock = IPowerfunction) private IPowerfunction prvGetMockPowerFunction() { //1.1 声明 泛型的Mock对象(mock = IPowerfunction) Mock<IPowerfunction> mockObject = new Mock<IPowerfunction>(); //1.2 设置Mock返回值——具体代表的内容 mockObject.Setup(m => m.PowerfunctionGetValue(2, 3)).Returns(8); //1.3 返回Mock对象(用途替代) return mockObject.Object; } //2. 调用Mock [Test(Description = "幂运算Powerfunction()的测试")] public void TestPowerfunction() { //2.1 调用私有函数成员, 产生代替接口的mock(此 IPowerfunction = Mock) IPowerfunction powFun = this.prvGetMockPowerFunction(); //2.2 实例化 出使用mock进行替代后的 对象 Methods methods = new Methods(powFun); //2.3 为综合接口传值、调用 double result = methods.PowerfunctionAction(2, 3); //2.4 设置断言,判断 Assert.AreEqual(8, result); } //……对其他函数(方法)的测试 #endregion } }
NUnit、Moq下载地址:
安装详解:/article/1579904.html
相关文章推荐
- 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用
- 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用
- 用Visual studio2005的单元测试框架实现一个简单的计算器
- 基于mock对象和JUnit框架简化Spring Web组件单元测试
- 软件测试技术JUnit和单元测试入门简介--JUnit实例
- 转使用Moq让单元测试变得更简单
- 【ASP.Net MVC3 】使用Moq让单元测试变得更简单
- [原创]基于mock对象和JUnit框架简化Spring Web组件单元测试
- 最简单的Flex框架Cairngorm实例,绝对容易
- OSG简介与最简单的实例
- MoQ,Mock,UnitTest单元测试,单元测试,还是单元测试!
- 关于二进制Web服务框架Hessian最简单代码实例
- 基于mock对象和JUnit框架简化Spring Web组件单元测试
- 用过滤器验证登陆框架,简单实例
- 基于dwr框架的简单实例 转帖
- ACE框架简介以及一个基于ACE的C/S服务程序实例
- 基于mock对象和JUnit框架简化Spring Web组件单元测试
- eclipse中简单的数据库查询实例以及Quantum插件简介
- C单元测试框架——CMockery (1) 简介
- OSG简介与最简单的实例