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的配合使用)的更多相关文章

  1. 【转】Android下编译jni库的二种方法(含示例)

    原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从N ...

  2. 【转】Android下编译jni库的二种方法(含示例) -- 不错

    原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从N ...

  3. c#单元测试:使用Moq框架Mock对象

    在.net中有几种mock框架可供选择,比如NMock,PhinoMocks,FakeItEasy和Moq.尽管Moq相对较新,但是它非常易用.不需要像传统的Record/Replay.并且使用Moq ...

  4. Mockito为什么不能mock静态方法

    因为Mockito使用继承的方式实现mock的,用CGLIB生成mock对象代替真实的对象进行执行,为了mock实例的方法,你可以在subclass中覆盖它,而static方法是不能被子类覆盖的,所以 ...

  5. python中的静态方法、类方法、属性方法(福利:关于几种方法更好的解释)

    该部分的三个属性都是高级方法,平时用的地方不是很多 一.静态方法 静态方法的使用不是很多,可以理解的就看一下,用的地方不是很多 class Dog(object): def __init__(self ...

  6. Js类的静态方法与实例方法区分以及jQuery如何拓展两种方法

    上学时C#老师讲到对象有两类方法,静态方法(Static)和实例方法(非Static),当时不理解静态是为何意,只是强记. 后来从事前端工作,一直在对类(即对象,Js中严格来说没有类的定义,虽众所周知 ...

  7. 无所不能的PowerMock,mock私有方法,静态方法,测试私有方法,final类

    1.为什么要用mock 我的一本书的解释: (1)创建所需的DB数据可能需要很长时间,如:调用别的接口,模拟很多数据 (2)调用第三方API接口,测试很慢, (3)编写满足所有外部依赖的测试可能很复杂 ...

  8. Atitti 载入类的几种方法    Class.forName ClassLoader.loadClass  直接new

    Atitti 载入类的几种方法    Class.forName ClassLoader.loadClass  直接new 1.1. 载入类的几种方法    Class.forName ClassLo ...

  9. java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)

     java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...

随机推荐

  1. 通用分页jsp页面显示

    注:本章内容都是在上一篇文章 通用分页后台显示:https://www.cnblogs.com/ly-0919/p/11058942.html  的基础上进行改进,所以有许多的类都在上一篇, 带来不便 ...

  2. vue生命周期在工作中的用法

    1.首先来官方服生命=周期的解释: beforeCreate():实例在内存中被创建出来,还没有初始化好data和methods属性. create():实例已经在内存中创建,已经初始化好data和m ...

  3. 最短路--SPFA及其优化

    SPFA Shortest Path Faster Algorithm 最短路径最快算法 算法思想 SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路 ...

  4. 1040 too many connections

    先重启mysql. 登录成功后执行以下语句查询当前的最大连接数:select VARIABLE_VALUE from information_schema.GLOBAL_VARIABLES where ...

  5. Navicat连接Oracle报ORA-12737错误

    替换oci.dll 文件分享百度网盘:链接:https://pan.baidu.com/s/1wayojGlKcgdMRZTvBqAUgw 密码:3d6j 把下载的文件放到Navicat文件夹里,然后 ...

  6. margin与padding的区别

    当子元素使用padding-top,不会影响到父元素的高度 使用margin-top,则会影响

  7. Oracle的dual是什么东西啊??(答:伪表)

    1. dual 确实是一张表.是一张只有一个字段,一行记录的表.2.习惯上,我们称之为'伪表'.因为他不存储主题数据.3. 他的存在,是为了操作上的方便.因为select 都是要有特定对象的.如:se ...

  8. luogu 4211

    题意 存在一棵树,每次询问 \(l, r, z\) 求 \[\sum_{i = l} ^ {r} deep(lca(i, z))\] 考虑 lca 的实质:两点到根的路径的交集中深度最大的点 其中一点 ...

  9. MongoDB之安装部署

    一.安装MongoDB 在安装MongoDB之前,应该先把MongoDB官方网站上下载下来,下载的地址如下: https://www.mongodb.com/download-center 下载完毕之 ...

  10. myeclipse导入项目

    因为现在项目大部分都是maven项目所以导入的时候因该选择