C#怎么测试静态方法?我给出了2种方案

问题

假设有一个方法需要判断当前小时范围,代码如下:

public class Class1
{public bool SomeMethod(){var hour = DateTime.Now.Hour;if (hour >= 9 && hour <= 12){return true;}return false;}
}

但是,在做单元测试时,测试会偶尔失败。

因为DateTime.Now没法控制

[Fact]
public void Test1()
{var expect = new Class1().SomeMethod();Assert.True(expect);
}

怎么办?!

1.接口替代

常用的解决方案是使用接口替代静态方法的直接调用,接口的实现可以使用依赖注入在运行时获得:

public interface IClock
{DateTime Now { get; }
}public class Class1
{public Class1(IClock clock){this.Clock = clock;}public IClock Clock { get; }public bool SomeMethod(){var hour = Clock.Now.Hour;if (hour >= 9 && hour <= 12){return true;}return false;}
}

可以手工或使用第三方Mock框架生成接口的实例,返回一个固定值,保证单元测试始终成功:

public class MockClock :IClock
{private readonly DateTime _now;public MockClock(DateTime now){ this._now = now; }public DateTime Now => _now;
}[Fact]
public void Test1()
{var expect = new Class1(new MockClock(new DateTime(1900,1,1,9,0,0))).SomeMethod();Assert.True(expect);
}  

2.Pose Mock

使用第三方Mock框架,比如Pose,直接Mock静态方法。

无需修改业务代码实现,只需在单元测试项目中引入nuget包Pose,然后修改测试用例代码如下:

[Fact]
public void Test1()
{Shim dateTimeShim = Shim.Replace(() => DateTime.Now).With(()=>new DateTime(1900, 1, 1, 9, 0, 0));PoseContext.Isolate(() =>{var expect = new Class1().SomeMethod();Assert.True(expect);}, dateTimeShim);
}

结论

这2种方案各有优缺点:

  • 接口替代

    • 优点:实现简单

    • 缺点:所有调用原静态方法的业务代码都需要增加依赖注入参数

  • Pose Mock

    • 优点:无需修改业务代码

    • 缺点:第三方库不能保证Mock所有静态方法成功

建议,针对新功能尽量使用接口,仅对不易改动的代码才使用Pose Mock。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Tomcat5.5中EL表达式无效的解决办法

问题&#xff1a; 在Tomcat5.5中&#xff0c;JSP页中使用EL表达式输出信息&#xff0c;例如&#xff1a; <% page language”java” import”java.util.*” pageEncoding”UTF-8″%><html><head>EL表达式</head><body>${header["User-Agent…

c语言全局变量和局部变量问题汇总

1、局部变量是否能和全局变量重名&#xff1f; 答&#xff1a;能&#xff0c;局部会屏蔽全局。要用全局变量&#xff0c;须要使用"::" 局部变量能够与全局变量同名&#xff0c;在函数内引用这个变量时&#xff0c;会用到同名的局部变量&#xff0c;而不会用到全局变…

本科4篇顶会论文如何做到?清华特奖高天宇干货分享:我是这样写论文、做实验、与导师相处...

全世界只有3.14 % 的人关注了爆炸吧知识本科生&#xff0c;距离“科研”有多远&#xff1f;有人还处在“小朋友你是否有很多问号”的状态&#xff0c;但也有人本科就连发顶会文章&#xff0c;光环闪瞎众人。其中可有什么秘诀&#xff1f;清华本科特奖获得者、清华计算机大四学生…

java final 修改_“无法改变的设计”——浅谈Java中的final关键字

在Java中&#xff0c;final关键字可以用来修饰类、变量(包括成员变量和局部变量)、方法&#xff0c;下面从这三个方面分别说明。final方法当一个方法被final修饰时&#xff0c;表明这个方法不能被子类重写。下面程序试图重写final方法&#xff0c;将会引发编译错误。public cla…

数据库日志的说明

清日志 如 dump transaction 数据库名 with no_log --清除日志backup log 数据库名 with no_log --截断事务日志dbcc shrinkdatabase(数据库名,10) --收缩的数据库&#xff0c;空出10%的空间来 先执行上面两句&#xff0c;这两句比较快…

.NET 6 预览版 7 Released

.NET 6 预览版 7 ReleasedRichard 2021 年 8 月 10 日我们很高兴发布 .NET 6 Preview 7。这是我们进入&#xff08;两个&#xff09;发布候选 (RC) 期之前的最后一次预览版本。在我们放慢发布速度之前&#xff0c;团队经常加班夜战来保证最后一组功能。在这个版本中&#xff0c…

孝顺孝顺,孝不如顺

摘自西西河&#xff1a;http://www.ccthere.com/article/3044112&#xff0c;作者&#xff1a;抱朴仙人 刚说到一把年纪还要被老爹教育&#xff0c;忽然发现河里颇有几位难友&#xff0c;呵呵。 话说这个孝道&#xff0c;一直是包括“赡养”和“陪伴”两个方面的&#xff0c;也…

一致性 hash 算法( consistent hashing )

consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出&#xff0c;目前在cache 系统中应用越来越广泛&#xff1b; 1 基本场景 比如你有 N 个 cache 服务器&#xff08;后面简称 cache &#xff09;&#xff0c;那么如何将一个对象 obje…

复工之后,如何让自己的时间更值钱

全世界只有3.14 % 的人关注了爆炸吧知识时间最不偏私给任何人都是二十四小时时间也最偏私给任何人都不是二十四小时而如何让自己的时间更值钱以下公众号或许能给你一些启示赶快扫码关注吧&#xff01;RSS精选ID&#xff1a;KindleNewsRSS精选是一个专注于时间管理iOS相关及Kind…

selenium autoit java_Java+Selenium——AutoIt工具处理文件上传

关于文件上传&#xff0c;这边介绍一个第三方工具&#xff0c;叫AutoIt&#xff0c;简单来说&#xff0c;这个是一个能支持桌面GUI自动化的工具&#xff0c;它支持脚本语言编写。这里&#xff0c;我们用AutoIt来做文件上传的演示。在Selenium脚本中如果需要AutoIt来协助这个文件…

Blazor+Dapr+K8s微服务之开发环境调试

1 安装Dapr开发调试环境1.1 Dapr 完整安装模式不支持开发调试在上一篇随笔《BlazorDaprK8s微服务之服务调用》中&#xff0c;我们通过为每个微服务运行dapr run ….dotnet run命令&#xff0c;以自宿主的方式在本地开发环境成功运行了服务调用的例子。但是&#xff0c;这种运行…

也谈cacti整合nagios(centos)

花了近一天的时间整合了cacti和nagios&#xff0c;cacti用来检测运行状态nagios主要用来预警。期间参考了很多网友的文章&#xff0c;在此感谢下&#xff01;在这里记录一下配置过程&#xff0c;以备后忘。。说整合其实只是表面的&#xff0c;cacti和nagios还是以他们原来的方式…

cursor 的moveToFirst和moveToNext和moveToPrevious以及moveToLast

查询出来的cursor的初始位置是指向第一条记录的前一个位置的&#xff0c;cursor.moveToFirst&#xff08;&#xff09;指向查询结果的第一个位置。一般通过判断cursor.moveToFirst()的值为true或false来确定查询结果是否为空。cursor.moveToNext()是用来做循环的&#xff0c;一…

这10个人,总是牛逼的无话可说

全世界只有3.14 % 的人关注了爆炸吧知识终于迎来知识君最喜欢的工作日了。热爱工作的知识君还是在认真地看书&#xff0c;码字。哈哈哈&#xff0c;有模友知道看得是什么书然而在拍完照片后&#xff0c;还是得想想今晚该写些啥东西。狄拉克 保罗狄拉克(Paul Adrien Maurice …

WebSocket服务器(物联网下行通知神器)

HttpServer是一个轻量级Web服务器&#xff0c;用于在嵌入式设备以及客户端环境中提供简单Web服务&#xff0c;同时也支持标准WebSocket服务。本文例程基于vs2022&#xff0c;基础例程可参考&#xff1a;https://www.yuque.com/smartstone/nx/httpserverWebSocket服务端WebSocke…

SCCM 2007系列教程之三日志文件

Microsoft System Center Configuration Manager 2007 中的所有客户端和站点服务器组件都将过程信息记录在单个日志文件中。您可以使用客户端和站点服务器日志文件中的信息来帮助您诊断在 Configuration Manager 2007 层次结构中可能出现的问题。默认情况下&#xff0c;Configu…

Unix常用命令

第一章 目录及文件操作命令 1.1 ls [语法]&#xff1a; ls [-RadCxmlnogrtucpFbqisf1] [目录或文件......][说明]&#xff1a; ls 命令列出指定目录下的文件&#xff0c;缺省目录为当前目录 ./&#xff0c;缺省输出顺序为纵向按字符顺序排列。-R 递归地列出每个子目录的内容-…

继续送假期干货——响应式图片工具smartImg

中午看《众妙之门》看到一个响应式图片处理工具&#xff08;点此查看&#xff09;的介绍&#xff0c;然后就心血来潮想着不妨自己写一个基于JQ的吧&#xff0c;于是就又有了这么一个干货给大家。 smartImg 的全部文件可以从我的Github上下载&#xff0c;其实它非常小巧&#xf…

一顿家庭火锅让本不富裕的家庭雪上加霜......

1 从此再也没有人相信你曾是个双眼皮▼2 在家吃火锅让一个本不富裕的家庭雪上加霜▼3 大型翻车现场▼4 各位大爷大伯&#xff0c;我先干了招待不周&#xff0c;还望海涵▼5 老外为了防止用手摸脸导致传染发明出来的新方法 ......但这东西难道不是宠物那啥用的吗&#xff1…

JAVA中pin什么意思_java语言中的多态概述

多态&#xff1a;一个对象相应着不同类型多态在代码中的体现&#xff1a;父类或接口的引用指向其子类对象。多态的优点&#xff1a;提高了代码的扩展性&#xff0c;前期定义的代码能够使用后期的内容。多态的弊端&#xff1a;前期定义的内容不能使用后期子类中定义的特有内容。…