用MOQ来Mock静态方法的 2种方法(含Moq和Fakes的配合使用)
Moq是无法直接模拟静态方法的,解决方式有两种:
1、需要修改正式代码,在源代码中建一个新的方法把静态方法包起来,调用的时候源代码调用时调用新方法而不是原来的静态方法。
在测试的时候,Mock掉这个新的方法,以达到模拟的目的
原来:
public class FormatClass
{
public static string FormatDate(DateTime date)
{
return date.ToString("yyyyMMdd");
}
} public class DoClass
{
public void Do()
{
var dateString = FormatClass.FormatDate(DateTime.Now);
Console.WriteLine(dateString);
}
} [TestClass]
public class Test
{
[TestMethod]
public void MyTest()
{
var mock = new Mock<DoClass>();
mock.Object.Do();
}
}
替换后:
public class FormatClass
{
public static string FormatDate(DateTime date)
{
return date.ToString("yyyyMMdd");
}
} public class DoClass
{
public void Do()
{
var dateString = DefineFormatDate(DateTime.Now);
Console.WriteLine(dateString);
} //包装一个方法用于Mock
public virtual string DefineFormatDate(DateTime date)
{
return FormatClass.FormatDate(date);
}
} [TestClass]
public class Test
{
[TestMethod]
public void MyTest()
{
var mock = new Mock<DoClass>();
//Mock方法
mock.Setup(a => a.DefineFormatDate(It.IsAny<DateTime>())).Returns("mock content");
mock.Object.Do();
}
}
2、由于Mircosoft Fakes框架可以使用Shim模拟静态方法,那么我们可以将Moq和Fakes配合起来,用Fakes模拟静态方法,其他判断还用Moq
[TestClass]
public class Test
{
[TestMethod]
public void MyTest()
{
var mock = new Mock<DoClass>();
//未Shim之前
mock.Object.Do(); using (ShimsContext.Create())
{
DFYYDream.Infrastructure.Fakes.ShimPinYinConvert.ConvertToPinYinStringBoolean = (String, Boolean) =>
{
return "mock content";
}; //已经Shim之后
mock.Object.Do();
} //moq可以正常判断
mock.Verify(a => a.DoOther2(), Times.AtLeast());
}
} public class DoClass
{
public void Do()
{
//一个中文转拼音的静态方法
var py = PinYinConvert.ConvertToPinYin("你好", false);
DoOther(py);
DoOther2();
} public void DoOther(string py)
{
Console.WriteLine(py);
} public virtual void DoOther2()
{
}
}
测试结果:
NIHAO
mock content
代码里的DFYYDream.Infrastructure.Fakes命名空间,是通过右击“引用”里的程序集的名称后,选择“添加Fakes程序集”自动生成的。
总结:
第一种方法不需要引入Fakes,但需要修改调用处的源代码
第二种方法不需要改把源代码,只需要在测试处模拟即可,但需要引入Fakes
用MOQ来Mock静态方法的 2种方法(含Moq和Fakes的配合使用)的更多相关文章
- 【转】Android下编译jni库的二种方法(含示例)
原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从N ...
- 【转】Android下编译jni库的二种方法(含示例) -- 不错
原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从N ...
- c#单元测试:使用Moq框架Mock对象
在.net中有几种mock框架可供选择,比如NMock,PhinoMocks,FakeItEasy和Moq.尽管Moq相对较新,但是它非常易用.不需要像传统的Record/Replay.并且使用Moq ...
- Mockito为什么不能mock静态方法
因为Mockito使用继承的方式实现mock的,用CGLIB生成mock对象代替真实的对象进行执行,为了mock实例的方法,你可以在subclass中覆盖它,而static方法是不能被子类覆盖的,所以 ...
- python中的静态方法、类方法、属性方法(福利:关于几种方法更好的解释)
该部分的三个属性都是高级方法,平时用的地方不是很多 一.静态方法 静态方法的使用不是很多,可以理解的就看一下,用的地方不是很多 class Dog(object): def __init__(self ...
- Js类的静态方法与实例方法区分以及jQuery如何拓展两种方法
上学时C#老师讲到对象有两类方法,静态方法(Static)和实例方法(非Static),当时不理解静态是为何意,只是强记. 后来从事前端工作,一直在对类(即对象,Js中严格来说没有类的定义,虽众所周知 ...
- 无所不能的PowerMock,mock私有方法,静态方法,测试私有方法,final类
1.为什么要用mock 我的一本书的解释: (1)创建所需的DB数据可能需要很长时间,如:调用别的接口,模拟很多数据 (2)调用第三方API接口,测试很慢, (3)编写满足所有外部依赖的测试可能很复杂 ...
- Atitti 载入类的几种方法 Class.forName ClassLoader.loadClass 直接new
Atitti 载入类的几种方法 Class.forName ClassLoader.loadClass 直接new 1.1. 载入类的几种方法 Class.forName ClassLo ...
- java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)
java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...
随机推荐
- 去除IDEA中xml黄色背景
idea版本:IntelliJ IDEA 2019.2.1 在编写mybatis的xml中会出现大面积黄色背景提示,看起来比较不舒服. 去掉黄色背景颜色 1.打开File->Settings-& ...
- vue报错 :NavigationDuplicated {_name: "NavigationDuplicated", name: "NavigationDuplicated"}
解决的几种办法 https://blog.csdn.net/weixin_43202608/article/details/98884620 这个适合所有vue的UI框架 在main.js下添加一下代 ...
- linux系列(十三):less命令
1.命令格式: less [参数] 文件 2.命令功能: less 与 more 类似,但使用 less 可以随意浏览文件,而 more 的功能不如less,而且 less 在查看之前不会加载整个文 ...
- 浅谈CLOSE_WAIT
浅谈CLOSE_WAIT 发表于2016-01-19 TCP 有很多连接状态,每一个都够聊十块钱儿的,比如我们以前讨论过 TIME_WAIT 和 FIN_WAIT1,最近时不时听人提起 CLOSE_W ...
- eclipse中Maven项目启动报错“3 字节的 UTF-8 序列的字节 3 无效。”
发生原因不知道. 解决方法是在pom.xml中追加 <properties> <project.build.sourceEncoding>UTF-8</project.b ...
- UOJ#467. 【ZJOI2019】线段树 线段树,概率期望
原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day1T2.html 前言 在LOJ交了一下我的代码,发现它比选手机快将近 4 倍. 题解 对于线段树上每一个节 ...
- Hadoop mapreduce过程分析
原理图: 中间结果的排序与溢出(spill)流程图 map分析: (1).输入分片(input split):在进行mapreduce之前,mapreduce首先会对输入文件进行输入分片(input ...
- Java 面向对象(六)
抽象类和抽象方法 抽象方法 在方法前面添加了一个关键字 abstract 抽象方法的特点 (1)抽象方法是没有方法体的. (2)抽象方法必须得要定义在抽象类 或 接口当中 (在类前面添加上了一个abs ...
- activemq jmx
增加: -Djava.rmi.server.hostname=<IP addr>
- vue 引入公共css文件
1.在入口js文件main.js中引入,一些公共的样式文件,可以在这里引入. import Vue from 'vue'import App from './App' // 引入App这个组件impo ...