前言

编写单元测试时,常常需要使用Mock框架(例如Moq)生成测试类的依赖接口的"模拟"实现,并验证接口是否按预期使用:

_mediatorMock = new Mock<IMediator>();_mediatorMock.Setup(x => x.Send(It.IsAny<IdentifiedCommand<CancelOrderCommand, bool>>(), default(CancellationToken))).Returns(Task.FromResult(true));

但是,对于IHttpClientFactory就不仅仅是Mock<IHttpClientFactory>这么简单了!

问题

因为,在实现代码中,我们并不是直接使用IHttpClientFactory对象,而是IHttpClientFactory对象使用CreateClient方法生成的HttpClient实例,而且我们也不希望真正的执行HTTP调用。

因此,我们需要Mock这种依赖性,并处理HttpClient实例的调用返回。

实现

IHttpClientFactory的Mock代码非常简单:

var httpClient = new HttpClient(handlerMock.Object) { BaseAddress = new Uri("https://www.baidu.com/") };var mockHttpClientFactory = new Mock<IHttpClientFactory>();mockHttpClientFactory.Setup(x => x.CreateClient("Baidu")).Returns(httpClient);

关键点在于,HttpClient构造函数传入的Mock对象handlerMock,它是用于实现发送请求的HTTP处理程序:

HttpResponseMessage result = new HttpResponseMessage();handlerMock.Protected().Setup<Task<HttpResponseMessage>>("SendAsync",It.IsAny<HttpRequestMessage>(),It.IsAny<CancellationToken>()).ReturnsAsync(result)

由于HttpMessageHandler的SendAsync方法可访问性级别是protected,因此需要使用.Protected()进行设置:

我们可以修改It.IsAny(),以匹配实际的请求。比如:

It.Is<HttpRequestMessage>(req => req.RequestUri.Query.Contains("My%20IO")
)

现在,我们就可以在单元测试中正常使用IHttpClientFactory了

service = new DemoService(mockHttpClientFactory.Object);

结论

在本文中,我们实现了Mock IHttpClientFactory。

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

单元测试 | 如何Mock IHttpClientFactory相关推荐

  1. React 16 + Jest单元测试 之 Mock Functions(Mock Names 和 Custom Matchers)

    转载 React 16 + Jest单元测试 之 Mock Functions(Mock Names 和 Custom Matchers) 项目初始化[这里使用之前的项目,节省时间] 项目初始化地址 ...

  2. Java单元测试(Junit+Mock+代码覆盖率)

    单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复.改进 ...

  3. 单元测试与 Mock 方法

    Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开. 编写自定义的 Mock 对象需要额外的编码工作,同时也可能 ...

  4. 使用 @MockBean 和 @SpyBean 解决 SpringBoot 单元测试中 Mock 类装配的问题

    最近在做某个项目的时候一直使用 @MockBean 来解决单元测试中 Mock 类装配到被测试类的问题.这篇文章主要介绍了 @MockBean 的使用例子以及不使用 @MockBean 而使用@Spy ...

  5. python单元测试mock_python3的单元测试模块mock与性能测试模块cProfile

    我们知道写完了代码需要自己跑一跑进行测试,一个写好的程序如果连测试都没有就上到生产环境是不敢想象的,这么做的人不是太自信就是太无知. 传统测试无非就是自己运行一下程序查看结果,或者前后端服务进行联调, ...

  6. python单元测试mock_Python单元测试的Mock是怎么回事

    单元测试 什么是单元测试, 维基百科上是这么定义的: unit testing is a method by which individual units of source code, sets o ...

  7. Golang单元测试、Mock测试以及基准测试

    之前参加字节跳动青训营而整理的笔记 Golang拥有一套单元测试和性能测试系统,仅需要添加很少的代码就可以快速测试一段需求代码. 一.单元测试 单元测试主要包括:输入.测试单元.输出.期望以及与期望的 ...

  8. 一文让你掌握单元测试的Mock、Stub和Fake

    单元测试中有几个神秘的概念,它们就是Mock,模拟对象:Stub,存根:Fake,伪对象,它们听起来很类似,也很容易混淆,让我们通过这篇文章揭开它们神秘的面纱,探索其幽深的小径. 1.什么是伪对象(F ...

  9. 单元测试fake mock stub

    单元测试fake,mock,stub理解 首先这三个词指的是概念,对于单元测试中各个对象的描述,有助于命名规范.在实际操作中,以测试需求为准. fake指为需要测试单元简单模拟了实际运行环境的,确保正 ...

最新文章

  1. Eclipse 导入 Tomcat 源码
  2. More than one file was found with OS independent path
  3. android mp4流格式,将RTSP流保存到android中的mp4文件
  4. kafka--storm--mongodb
  5. Gui系统之View体系(2)---View的setContent
  6. 计算器用户界面与业务逻辑的分离
  7. left join 后边的on条件 小记
  8. 使用DBUA单一实例如何升级至Oracle数据库12c
  9. IOS仿微信朋友圈的日期处理
  10. robotframework 常用关键字
  11. 第三届(2016)科学数据大会——科学数据与创新发展征文通知
  12. pytorch使用Ray-tune对原有训练模型的代码改写,自动调参(一)
  13. 【经典算法】——KMP,深入讲解next数组的求解
  14. 人脸验证(四)--CenterLoss
  15. HDOJ/HDU 1565 方格取数(1)
  16. wget下载太慢问题
  17. 蓝桥杯第十二届省赛JAVA C组 试题 F: 时间显示
  18. 传统安防监控直播的四分屏的前端展示代码
  19. 我从冯·诺依曼计算机体系,追溯到了JVM,一切原来如此
  20. 【Android界面实现】Starting an Activity(Activity生命周期金字塔模型)

热门文章

  1. JailbreakMe.com-最新浏览器模式破解iPhones,iPads和iPod Touches方法
  2. 【视频】CCNA——telnet和SSH的配置
  3. 安装Linux后的遗留问题
  4. mysql数据库的新特性_【数据库】MySQL新特性归档介绍
  5. NUMPY数据集练习 ----------SKLEARN类
  6. JS框架_(JQuery.js)纯css3进度条动画
  7. redis集群报Jedis does not support password protected Redis Cluster configurations异常解决办法...
  8. 关于c#调用c编译器
  9. 4 关卡流 进阶_全息武器全解析,记住4个点全区第一就是你!
  10. linux 内核fpic,linux编译动态库 fPIC作用