用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 ...
随机推荐
- 通用分页jsp页面显示
注:本章内容都是在上一篇文章 通用分页后台显示:https://www.cnblogs.com/ly-0919/p/11058942.html 的基础上进行改进,所以有许多的类都在上一篇, 带来不便 ...
- vue生命周期在工作中的用法
1.首先来官方服生命=周期的解释: beforeCreate():实例在内存中被创建出来,还没有初始化好data和methods属性. create():实例已经在内存中创建,已经初始化好data和m ...
- 最短路--SPFA及其优化
SPFA Shortest Path Faster Algorithm 最短路径最快算法 算法思想 SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路 ...
- 1040 too many connections
先重启mysql. 登录成功后执行以下语句查询当前的最大连接数:select VARIABLE_VALUE from information_schema.GLOBAL_VARIABLES where ...
- Navicat连接Oracle报ORA-12737错误
替换oci.dll 文件分享百度网盘:链接:https://pan.baidu.com/s/1wayojGlKcgdMRZTvBqAUgw 密码:3d6j 把下载的文件放到Navicat文件夹里,然后 ...
- margin与padding的区别
当子元素使用padding-top,不会影响到父元素的高度 使用margin-top,则会影响
- Oracle的dual是什么东西啊??(答:伪表)
1. dual 确实是一张表.是一张只有一个字段,一行记录的表.2.习惯上,我们称之为'伪表'.因为他不存储主题数据.3. 他的存在,是为了操作上的方便.因为select 都是要有特定对象的.如:se ...
- luogu 4211
题意 存在一棵树,每次询问 \(l, r, z\) 求 \[\sum_{i = l} ^ {r} deep(lca(i, z))\] 考虑 lca 的实质:两点到根的路径的交集中深度最大的点 其中一点 ...
- MongoDB之安装部署
一.安装MongoDB 在安装MongoDB之前,应该先把MongoDB官方网站上下载下来,下载的地址如下: https://www.mongodb.com/download-center 下载完毕之 ...
- myeclipse导入项目
因为现在项目大部分都是maven项目所以导入的时候因该选择