用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 ...
随机推荐
- python - orm 字段
1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True. ...
- location对象属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- LeetCode 308. Range Sum Query 2D - Mutable
原题链接在这里:https://leetcode.com/problems/range-sum-query-2d-mutable/ 题目: Given a 2D matrix matrix, find ...
- svn优点跟缺点?
优点: 1.svn优点:集中式管理,管理方式在服务端配置好,客户端只需要同步提交即可,使用方便,操作简单,很容易就可以上手 2.在服务端统一控制好访问权限,利用代码的安全管理. 3.所有的代码以服务端 ...
- HTML 004 属性
HTML 属性 属性是 HTML 元素提供的附加信息. HTML 属性 HTML 元素可以设置属性 属性可以在元素中添加附加信息 属性一般描述于开始标签 属性总是以名称/值对的形式出现,比如:name ...
- sql server 存储过程---游标的循环
sqlserver中的循环遍历(普通循环和游标循环) sql 经常用到循环,下面介绍一下普通循环和游标循环 1.首先需要一个测试表数据Student
- GreenPlum/postgres copy命令导出/导入数据
一.COPY命令简单实用 1.copy在postgres与GreenPlum介绍 1.1 postgrespostgres的COPY命令可以快速的导出/导入数据到postgresql数据库中,支持常用 ...
- 利用webuploader实现超大文件分片上传、断点续传
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
- 数据库学习之七--视图(View)
一.定义 视图:指计算机数据库中的一个临时虚拟表,其内容由查询定义:同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在. 二.优点 1. 优点: a. ...
- P3410 拍照
漂亮小姐姐点击就送:https://www.luogu.org/problemnew/show/P3410 题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一 ...