1. 什么是 Mockito

Mockito 是一个强大的用于 Java 开发的模拟测试框架, 通过 Mockito 我们可以创建和配置 Mock 对象, 进而简化有外部依赖的类的测试.

2. 为什么使用Mockito

我们系统一般的功能是controller->biz->service→Dao

如果我们只想测试一个biz中的功能,我们必须配置好类与类之间的关系,组装好一个完整的biz对象,才能去运行biz中要测试的代码,但是在微服务大行其道的今天,有些依赖是本地无法运行的,或者你本地是连接不到线上数据库的,这种时候怎么办?测试就无法进行了吗?

Mock就是为了解决这个问题而产生的

上述那个场景,我们分清我们需要测试的核心逻辑,而不是测试被依赖的组件或者方法,那么我们可以Mock掉这些依赖,让其返回一个可以预期的值。例如需要DB依赖的时候,Mock一个Dao,需要线上组件依赖的时候,Mock一个线上组件。

我们如果 mock 一个方法的意图是什么:

  1. 在特定输入参数的情况下期待需要的输出结果(返回值)
  2. 在方法抛出某种类型异常调用者作出的反应

3. 上手使用

3.1. 首先导包

<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>2.23.4</version><scope>test</scope>
</dependency>

3.2. 创建个Mock对象

既然已经明白了Mock的用途,那就明白Mock本质是创造个假对象,伪装使用


@Testpublic void createMockObject() {// 使用 mock 静态方法创建 Mock 对象.Map map = mock(Map.class);Assert.assertTrue(map instanceof Map);// mock 方法不仅可以 Mock 接口类, 还可以 Mock 具体的类型.HashMap mock = mock(HashMap.class);Assert.assertTrue(mock instanceof Map);Assert.assertTrue(mock instanceof HashMap);}

3.3. 配置Mock对象的行为

@Testpublic void configMock() {Map map = mock(Map.class);//当调用map.size()方法时候,返回100when(map.size()).thenReturn(100);Assert.assertEquals(map.size(), 100);//当调用map.put(1,2)方法时候,返回true,参数要匹配when(map.put(1,2)).thenReturn(true);   Assert.assertTrue(map.put(1,2));//当调用map.get(1)方法时候,抛空指针doThrow(new NullPointException()).when(map).get(1);//表示调用size()方法什么都不做,个人觉得可以用在依赖组件或者依赖方法返回void的情况下doNothing().when(map).size();map.size();verify(map, times(1)).size();  //verify检测方法调用,这表明size方法调用一次}

上述只是Mockito一些常规的方法,感觉也够用了,如果需要其他方法可以看看api见名知意或者看看文档

3.4. 部分模拟spy


@Testpublic void testSpy() {List list = new LinkedList();List spy = spy(list);// 对 spy.size() 进行定制.when(spy.size()).thenReturn(100);spy.add("one");spy.add("two");// 因为我们没有对 get(0), get(1) 方法进行定制,所有这两个调用的是真实方法Assert.assertEquals(spy.get(0), "one");Assert.assertEquals(spy.get(1), "two");Assert.assertEquals(spy.size(), 100);}

个人一般都采用部分模拟,模拟关键

有可能你要测试的方法名为A,A中调用B方法,而B方法是个要mock的,那么只需要when(spy.B()).thenReturn(xx);即可,无需自己调用,方法中调用也会触发mock

3.5. 捕获参数

一个方法调用过程中,传递的参数也可以被捕获

@Testpublic void testCaptureArgument() {String param = "test";  //字符串参数List mockObject = mock(List.class);//mock一个listArgumentCaptor<String> paramObject = ArgumentCaptor.forClass(String.class); //捕获参数的对象mockObject.add(param); //mock对象执行add方法,将test添加进其中verify(mockObject).addAll(paramObject.capture());//捕获参数Assert.assertEquals("test", paramObject.getValue()); //断言验证}

Mockito快速使用教程相关推荐

  1. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  2. Subversion快速入门教程

    2019独角兽企业重金招聘Python工程师标准>>> 如何快速建立Subversion服务器,并且在项目中使用起来,这是大家最关心的问题,与CVS相比,Subversion有更多的 ...

  3. ​HealthKit开发快速入门教程大学霸内部教程

    ​HealthKit开发快速入门教程大学霸内部教程 ​ ​ 国内第一本HealthKit专向教程.本教程详细讲解iOS中,如何使用HealthKit框架开发健康应用.最后,本教程结合HealthKit ...

  4. Apple Watch开发快速入门教程

     Apple Watch开发快速入门教程  试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...

  5. 指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程

    指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程 ​1.4.2  指示灯组 指示灯组的放大图如图1.5所示. 图1.5  指示灯组 各个指示灯对应的功能如下: q  RX:对应于0号端口 ...

  6. 游戏控制杆OUYA游戏开发快速入门教程

    游戏控制杆OUYA游戏开发快速入门教程 1.2.2  游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4  游戏控制杆各个角度的 ...

  7. Arduino Yun的主要部件介绍选自Arduino Yun快速入门教程

    Arduino Yun的主要部件介绍 1.4.1  主要部件 Yun的主要部件如图1.4所示. 图1.4  Arduino Yun的主要部件 在Yun小小的板子上集成了两颗处理器.一个是ATmega3 ...

  8. 认识AndEngine选自Android 2D游戏引擎AndEngine快速入门教程

    认识AndEngine什么是AndEngine 随着Android手机.平板的盛行,Android下的游戏也不断的变得火热.而对于游戏开发有兴趣的同学们,应该也想要学习开发游戏.虽说游戏开发的引擎较多 ...

  9. OUYA游戏开发快速入门教程1.2OUYA的硬件规格

    OUYA游戏开发快速入门教程1.2OUYA的硬件规格 从官网上购买回来的OUYA产品,包含游戏主机.游戏控制杆.说明书.电源线.HDMI线.电源线和电池,如图1-2所示.本节就来简要介绍下,游戏主机和 ...

最新文章

  1. 2021年大数据ELK(一):集中式日志协议栈Elastic Stack简介
  2. Oracle Parallel模式
  3. C#常用正则表达式总结
  4. linux 在文本模式下(命令模式)下,中文是乱码,如何解决?
  5. 入门与实战_商品运营入门——实战秘籍
  6. 视频文件详细信息python3_如何用python3爬取自己的收藏夹视频信息
  7. android 动画 最顶层_【Android编程实战】StrandHogg漏洞复现及原理分析_Android系统上的维京海盗...
  8. 超详细!使用OpenCV深度学习模块在图像分类下的应用实践
  9. 《Go语言圣经》学习笔记 第四章 复合数据类型
  10. OC之非ARC环境下循环retain问题
  11. MD5 算法描述及实现
  12. Oracle Certified Master For Java EE 5/6 Comes
  13. 如何将php改成mp4,如何将swf转换成mp4
  14. 如何快速进入/打开cmd--快捷键
  15. PS 基本了解和图层
  16. html怎么设置火狐ie兼容模式,火狐浏览器兼容模式如何设置?火狐浏览器兼容模式设置方法分享...
  17. 封装、private、this、 setter/gette、构造方法和标准类的定义
  18. Java腐烂的橘子leetcode
  19. 一文详解窄脉冲LIV测试系统的特点和功能
  20. 高一计算机课的总结,高中《信息技术》期末教学总结范文

热门文章

  1. 2022.09.01 最新配置maven阿里云仓库配置
  2. 英魂之刃服务器维护在几点,2016英魂之刃8.19有没有维护
  3. 吉尔伯特定律(转载)
  4. 对‘XXX‘未定义的引用
  5. 关于_CameraDepthTexture的疑惑
  6. 2021-04-1 芯片74LS161使用总结
  7. C语言实现顺序栈的基本操作(初始化、判断空、入栈、出栈、获取栈顶元素)
  8. excel 中插入文件
  9. jq、js 添加/删除class
  10. 线速处理能力的计算方法