在真实的测试当中,并不是所有的逻辑都可以自己控制,因此有了Mock测试。今天就结合场景来讲一下怎么做Mock测试。

适合对象:初次尝试集成和使用Mockito进行单元测试的开发同学。

Mock框架的集成

这里选择的是Mockito + PowerMockito。为什么会集成PowerMockito,是因为有个想要Mock的方法是static方法。这个需要PowerMockito,假如都只是普通类,就可以不用了。

集成关键点如下:

1、版本对应:这两个Mockito的版本是有一个对应关系,假如不对应,会出现类找不到的情况。

这是我的集成版本:

<dependency>   <groupId>org.mockitogroupId>   <artifactId>mockito-coreartifactId>   <version>2.28.2version>   <scope>testscope> dependency> <dependency>   <groupId>org.powermockgroupId>   <artifactId>powermock-module-junit4artifactId>   <version>2.0.2version>   <scope>testscope> dependency> <dependency>   <groupId>org.powermockgroupId>   <artifactId>powermock-api-mockito2artifactId>   <version>2.0.2version>   <scope>testscope>dependency>

2、注解方式集成:因为使用spring boot的项目,所以考虑怎么用注解方式集成。最后我的注解方案如下所示:

@RunWith(PowerMockRunner.class)@PrepareForTest({JdbcClient.class})@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)@PowerMockIgnore({"javax.net.ssl.*","javax.management.*", "javax.security.*", "javax.crypto.*"})

这几个,都有自己的用处,分别说下:

· @RunWith(PowerMockRunner.class) :假如要使用powermock,那就需要配置这个,不然powermock无法使用

· @PrepareForTest({JdbcClient.class}) :这里的列表,设定的是需要static mock 的类,我的测试场景中,需要mock JdbcClient的static query 方法

· @PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class) :一开始,只配置了前两个,然后发现从spring中inject注入的service都为空了。原来要需要使用这个注解,这样就和spring test 组合上了

· @PowerMockIgnore({"javax.net.ssl.*","javax.management.*","javax.security.*","javax.crypto.*"}) :PowerMock大概是mock的太多了,所以假如没有这行注释,也是各种报错。ClassCastException: class sun.security.provider.ConfigFile 这种。

TIPS:这些注解可以写到一个abstract TestClass 上,后面的测试类继承这个就方便了。

Mock场景举例

好,正式开始Mock。首先来讲,网上那些例子,好多都太简单了,不能当做实际场景。比如Mock ClassA.method1,然后直接验证method1的结果。这种只能验证集成的对不对。还是结合真实场景比较好。

1

场景一:修改外部服务调用,比如调用支付宝支付,或者发个短信什么的,也可以是数据库查询。

有时候,我们不希望真的去调用外部(比如配置太复杂,比如收费,比如想模拟错误结果)。或者想自己控制数据库查询结果(或者遇到了我这边只有正式环境才有某个库的情况)。那这时候,就需要使用Mock Service来解决。

先撸代码,再分析。

这个场景讲解Mock的常规使用手法,以及在spring注入service情况下,如何处理Mock。

public class MockitoTest extends BaseTest {    @Autowired    DemoService demoService;    @Mock    RemoteService remoteService;    @Test    public void testHack() throws Exception {        demoService.setRemoteService(remoteService);                String result = "fail";        Mockito.when(remoteService.sendRequest(any())).thenReturn(result);        String callResult = demoService.callRemote("something");        assertEquals("fail", callResult);                Mockito.verify(remoteService).sendRequest(any());    }}

这个场景感觉用的挺多的。demoService是想要测试的功能,其中用到了remoteService.sendRequest的结果。而又不想实际调用remoteService。这时候就可以先把remoteService.sendRequest给mock掉,给出自己设定的返回结果。

这时候要注意的一个点是:remoteService并不归属springContext管理,所以run test 以后,会发现,这个mock毫无作用。debug之下,可以看到注入和Mock的remoteService并不是一个实例。

那如何使remoteSerivce变成mockService,这里有两个思路。

一、就是上面的方案,用mockSerivce去替换demoSerivce里的remoteService。

demoService.setRemoteService(remoteService);

二、替换springContext里面的remoteSerice,这就需要使用@MockBean 这个注解。然后,所有注入的remoteService,都是Mock生成的service。

   @MockBean       RemoteService remoteService;

但是据说MockBean有副作用,会多次重启Spring context。可能也会污染上下文。暂时没有去尝试研究。

2

场景二:修改静态类方法,比如一些单例的方法。

在我的场景里,是自定义了一个单例JdbcClient,client保存连接池,然后发起请求。

这个是使用PowerMockito,因为只有他能mock static方法。

先来代码:

public class MockitoTest extends BaseTest {     @Autowired    DemoService demoService;    @Test    public void testHack() throws Exception {        String result = "fail";        PowerMockito.mockStatic(JdbcClient.class);        Mockito.when(JdbcClient.sendRequest(any())).thenReturn(result);        String callResult = demoService.callRemote("something");        assertEquals("fail", callResult);    }}

这里的主要用法就是 PowerMockito.mockStatic 这个。但是要结合之前的两个注解:

@RunWith(PowerMockRunner.class)

@PrepareForTest({JdbcClient.class}) 这个使用才有效。

就写这两个场景吧。后续用到比较好的场景再补充,也欢迎大家提供更多使用场景一起学习学习。

如果你有任何关于测试的问题或者想要了解的知识,欢迎评论区留言给我们,小编会在第一时间给你解答的~

链接:https://zhuanlan.zhihu.com/p/168278499

本文为51Testing经授权转载,转载文章所包含的文字来源于作者。如因内容或版权等问题,请联系51Testing进行删除

推荐阅读

点击阅读☞怎样用最简单的方式生成开发测试mock数据?

点击阅读☞APP测试的极简Mock方法——Mock服务端接口

点击阅读☞PowerMock单元测试踩坑与总结

点击阅读☞单元测试—mock技术基础

点击阅读☞软件测试—Mock 和Stub的区别

其他service 单例 工具类_获取不到,虚拟来凑?这个工具不得不学!相关推荐

  1. java 文本工具类_干货:排名前16的Java工具类

    原标题:干货:排名前16的Java工具类 作者丨Java技术栈 https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Ja ...

  2. java+基于dom4j工具类_基于dom4j的xml映射实体的工具类(java)

    基于dom4j的xml映射实体的工具类(java) 工具是基于dom4j,使用反射使实体属性与xml的标签关联,目前兼容List,Map后续更新兼容. 历史更新: 发布-2019-6-22 增加注解@ ...

  3. java Http消息传递之POST和GET两种方法--通过实用工具类来获取服务器资源

    实现该方法需要导入一些jar包 可以去一下地址下载: http://pan.baidu.com/s/1hqrJF7m /** * 实用工具类来获取服务器资源 * * get方法传送数据 * * 1.通 ...

  4. Unity程序框架总结归置系列(1)——单例基类

    写在前面的话 这个系列的博客,是博主准备用来记录总结unity开发手游要用到的最基本的公共模块,也可以说是程序框架.当然,我只会在这里给出最基本的框架版本,希望能帮助自己理清思绪,向主程靠近. 因为每 ...

  5. DateUtils 工具类:获取指定月份第一天时间,最后一天时间

    获取指定月份第一天时间 getMinDateMonth ,最后一天时间 getMaxDateMonth ,将时间区间按照月份分组,拆分多个片段 getDateSplitMonth 指定月份的下个月 g ...

  6. 什么是java工具类_常用高效 Java 工具类总结

    一.前言 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码 ...

  7. java开发工具排名_干货:排名前16的Java工具类

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...

  8. 解决spring的读取文件的工具类来获取文件等操作

    今天项目又遇到了,,,读取项目下文件的情况下. 其实这个挺头疼的,,,特别是 Java web项目 下的方式和 Java 项目 下 读取文件的相对路径是有点区别的...所以感觉挺不好搞的... 而且 ...

  9. java常用工具类_java(二):工作中常用到的工具类

    工作中大家要用到很多工具类,第三方的jar中有很多现成的工具类符合自己的项目需要,这个时候就不需要去重复造轮子了,从而节省了很多时间,大家可以利用这些时间去做其它重要的事情,如果没有符合自己的工具类, ...

最新文章

  1. WCF 和 ASP.NET Web API
  2. BigData之Hive beeline:beeline的简介、使用方法之详细攻略
  3. http端口_PhpStorm 修改默认端口号63342
  4. JMS学习三(ActiveMQ消息的可靠性)
  5. Write a simple HTML Browser(hdu1088)
  6. 【Spark工作原理】Spark任务调度理解
  7. Aggregate 为字符串数组元素添加单引号 可用于SQL数据查询 in
  8. 华为的手册和官网视频,学习网络基础
  9. Android面试题整理
  10. 再论硬件编程,芯片级开发技术。
  11. Unity3D AI:导航系统-导航网格生成
  12. DRF实战1 - 环境搭建
  13. 坚果pro2救砖专用(文末包含twrp900E的解决方法)
  14. 【noi.ac #1997】A. 制胡窜
  15. 几何图形变化(Codevember)
  16. 【msvcr120.dll下载】msvcr120.dll丢失怎么修复
  17. 增长黑客:如何低成本实现爆发式增长
  18. 基于c#winform的可视化打印标签模板设计器及Labview与C#调用模板Demo
  19. Python网络爬虫:PPT素材
  20. pgpool-ii的安装与使用

热门文章

  1. 数字化风控全流程 实操课程V2.0 第三期
  2. laravel字符截断
  3. Nginx-windows
  4. embed标签 阻止点击事件 让父元素处理点击事件
  5. 学习笔记——SM2算法原理及实现
  6. 在webstorm中新建模板
  7. 使用JDBC处理Oracle大数据
  8. Android开发14——监听内容提供者ContentProvider的数据变化
  9. 解题报告 幸福的道路
  10. 干货—MySQL常见的面试题+索引原理分析!