用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 ...
随机推荐
- The 2019 China Collegiate Programming Contest Harbin Site J. Justifying the Conjecture
链接: https://codeforces.com/gym/102394/problem/J 题意: The great mathematician DreamGrid proposes a con ...
- PHP基础语法之 位运算
写了几年PHP的人都好奇说,没有用过位运算符.所以,此处你看二进制看的头晕,就去T¥M¥D吧. 位运算符基本不用,我们也将这个知识设置为了解级别.位运算符的知识点,你不想学习也可以.等以后用到位运算的 ...
- 学到了林海峰,武沛齐讲的Day25-完
@property @classmethod @staticmethod 类的继承
- Bzoj 1566: [NOI2009]管道取珠(DP)
1566: [NOI2009]管道取珠 Time Limit: 20 Sec Memory Limit: 650 MB Submit: 1558 Solved: 890 [Submit][Status ...
- surprise库官方文档分析(二):使用预测算法
1.使用预测算法 Surprise提供了一堆内置算法.所有算法都派生自AlgoBase基类,其中实现了一些关键方法(例如predict,fit和test).可以在prediction_algorith ...
- 如何将web转化成应用程序?
nativefier 最近无意中发现这个开源项目,Nativefier,看着它的项目介绍,以及1w+ 的 Star,感觉自己错过了一个世纪. 介绍 Nativefier是一个命令行工具,可以轻松地为 ...
- dashucoding记录2019.6.8
WordPress网站 网址: https://cn.wordpress.org/ 阿里云市场 https://market.aliyun.com/products/53616009?spm=a2c4 ...
- ELF格式说明
ELF file header (ELF文件头) /* The ELF file header. This appears at the start of every ELF file. */ #de ...
- Spring Cloud Gateway(九):网关过滤器 GatewayFilter
本文基于 spring cloud gateway 2.0.1 1.简介 GatewayFilter 网关过滤器用于拦截并链式处理web请求,可以实现横切的与应用无关的需求,比如:安全.访问超时的设置 ...
- centos7 安装 mysql5.6(MySQL-5.6.44-1.el7.x86_64.rpm-bundle.tar)
1.卸载MariaDB rpm -qa | grep -i mariadb rpm -e --nodeps mariadb-libs--.el7.x86_64 2.卸载已有Mysql 卸载旧版本mys ...