1 mockito概述

Mockito is a mocking framework that tastes really good. It lets you write beautiful tests with a clean & simple API. Mockito doesn’t give you hangover because the tests are very readable and they produce clean verification errors.

Mockito是一个非常不错的模拟框架。 它使您可以使用干净简单的API编写漂亮的测试。 Mockito不会给您带来麻烦,因为这些测试可读性强,并且会产生清晰的验证错误。

官方说明-how简要版本

mockito官方文档-详细版本

特性和动机github说明

其特性如下:

  • mock具体的类和接口;
  • 小注释语法糖-@Mock
  • 验证错误是干净的-单击堆栈跟踪以查看测试中失败的验证; 单击异常原因以导航到代码中的实际交互。 堆栈跟踪始终是干净的。
  • 允许按顺序进行灵活的验证(例如:按顺序进行验证,而不是每次交互都进行验证)
  • 支持精确次数和最少一次的验证
  • 使用参数匹配器(anyObject(),anyString()或refEq()进行基于反射的相等匹配)的灵活验证或存根
  • 允许创建自定义参数匹配器或使用现有的Hamcrest匹配器

2 mockito应用

gradle仓库添加相关配置如下:

repositories { jcenter() }
dependencies { testCompile "org.mockito:mockito-core:2.+" }

之于maven的相关配置,可以搜索添加pom的相关依赖;

2.1 验证互动

import static org.mockito.Mockito.*;// mock creation
List mockedList = mock(List.class);// using mock object - it does not throw any "unexpected interaction" exception
mockedList.add("one");
mockedList.clear();// selective, explicit, highly readable verification
verify(mockedList).add("one");
verify(mockedList).clear();

2.2 存根方法调用

// you can mock concrete classes, not only interfaces
LinkedList mockedList = mock(LinkedList.class);// stubbing appears before the actual execution
when(mockedList.get(0)).thenReturn("first");// the following prints "first"
System.out.println(mockedList.get(0));// the following prints "null" because get(999) was not stubbed
System.out.println(mockedList.get(999));

2.3 mock注解使用

  public class ArticleManagerTest {@Mock private ArticleCalculator calculator;@Mock private ArticleDatabase database;@Mock private UserProvider userProvider;private ArticleManager manager;

2.4 回调

 when(mock.someMethod(anyString())).thenAnswer(new Answer() {public Object answer(InvocationOnMock invocation) {Object[] args = invocation.getArguments();Object mock = invocation.getMock();return "called with arguments: " + Arrays.toString(args);}});//Following prints "called with arguments: [foo]"System.out.println(mock.someMethod("foo"));

2.* 更多

更多说明参加详细资料文档mockito官方文档-详细版本

3 verify

Mockito提供vertify关键字来实现校验方法是否被调用,其具体作用可总结如下:

  • 测试方法是否被调用;
  • vervify(mock,times)的具体调用次数;
 @Testpublic void update() throws Exception {boolean result = personService.update(1, "new name");//验证mockDao的getPeron从未被调用verify(mockDao,never()).getPerson(1);assertTrue("must true", result);//验证是否执行过一次getPerson(1)verify(mockDao, times(1)).getPerson(eq(1));//验证是否执行过一次updateverify(mockDao, times(1)).update(isA(Person.class));
}

但是需要注意的是verify的使用限制于mack对象,对于普通对象不支持相关检测,否则会触发相关错误。

 Argument passed to verify() is of type RegistrationMgrActor and is not a mock!
Make sure you place the parenthesis correctly!
See the examples of correct verifications:verify(mock).someMethod();verify(mock, times(10)).someMethod();verify(mock, atLeastOnce()).someMethod();
org.mockito.exceptions.misusing.NotAMockException:
Argument passed to verify() is of type RegistrationMgrActor and is not a mock!
Make sure you place the parenthesis correctly!
See the examples of correct verifications:verify(mock).someMethod();verify(mock, times(10)).someMethod();verify(mock, atLeastOnce()).someMethod();at *******************
1 test completed, 1 failed
FAILURE: Build failed with an exception.
* What went wrong:

4 mock和spy的区别

项目中,有些函数需要处理某个服务的返回结果,而在对函数单元测试的时候,又不能启动那些服务,这里就可以利用Mockito工具。Mockito中的Mock和Spy都可用于拦截那些尚未实现或不期望被真实调用的对象和方法,并为其设置自定义行为。二者的区别在于:

1、Mock声明的对象,对函数的调用均执行mock(即虚假函数),不执行真正部分。

2、Spy声明的对象,对函数的调用均执行真正部分。

5 mockito的使用建议

这是官方网站上给出的一些mockito使用备忘:

  1. 不要mock你不曾拥有的类型;
  2. 不要试图mock值对象;
  3. 不要mock所有的东西;
  4. 用测试表达爱意;

以下是本人的一些感悟:

  1. 好的面向的对象的业务代码对于mock测试代码的编写也是有帮助的,反向的坏过程的代码会增加你写mock代码的过程。因此我们写一个逻辑的时候–最好多想想如何好用也好测–这对于函数层次结构、入参传递都是有很多需要注意的事项;
  2. 对于对值结果要求比较多的测试内容,最好直接构造你的预期结构而不是mock,mock适合测试流程,但不是所有的东西!
  3. 一开始就学着去写,而不是写完了测完了再去补,否则你写单元测试的目的完全没有达到。我们写单元测试从一开始就是希望呢能在一个不那么严格的环境里面把自己的逻辑测到!
  4. 函数不要嵌套太深,学会抽象公共方法;
  5. 特别注意静态工具类方法的使用,用的不好可能会加大自己写测试代码的复杂度。

mockito简要教程相关推荐

  1. 样式表(CSS:Cascading Style Sheets)简要教程[上]

    首先提供两个手册的下载 CSS2&JavaScript.rar 一.样式表基础 1. 样式表中每一个条目由选择符(selector)和对应的规则组成,选择符通常是HTML元素名称,也可以是类( ...

  2. ubuntu安装WPS简要教程

    ubuntu安装WPS简要教程 $ sudo apt-get update 然后前去WPS官网下载最新的deb安装包,然后进入下载了的安装包的文件夹下,打开命令窗口,执行如下命令: sudo dpkg ...

  3. 华硕固件安装扩展插件_华硕RT-AC1200GU安装迅雷插件简要教程

    华硕RT-AC1200GU安装迅雷插件简要教程 2019-04-23 15:54:38 7点赞 54收藏 11评论 家里的原来的路由器为极路由1,太老了,不稳定.掉线,想着换个路由器.家里也有一个小米 ...

  4. XML简要教程(适合初学者)

    XML简要教程 XML 指可扩展标记语言(eXtensible Markup Language), 被设计用来传输和存储数据.是各种应用程序之间进行数据传输的最常用的工具. XML提供了一套夸平台,跨 ...

  5. itpt_TCPL 第一章:C简要教程

    2016.06.19 – 07.05 个人英文阅读练习笔记(极低水准). 06.19 第一章:C语言的一个简单教程 让我们以对C语言的一个快速介绍开始.我们的目标是展示语言在真实程序中所需元素,但并不 ...

  6. fish shell 简要教程以及对bash的兼容性讨论。

    本文的亮点在于两点:1. 提出了一种fish与bash兼容性的临时方案,2. 自己新建了一个属于自己的fish主题. fish的官网宣传语是 Finally, a command line shell ...

  7. Mockito 简明教程

    原文同步至 http://waylau.com/mockito-quick-start/ Mock 测试是单元测试的重要方法之一.本文介绍了基于 Java 语言的 Mock 测试框架 -- Mocki ...

  8. 【Matlab-NURBS工具箱简要教程及实例 】

    Matlab-NURBS工具箱使用教程 添加NURBS工具箱 在附加功能里添加NURBS工具箱 安装完成后可以在'函数'处查看API,也打开文件夹查看. 强烈推荐同步安装gnurbs工具,它完全代替n ...

  9. gns3使用简要教程(gns3-wireshark捕获教程)

    1.安装 可以去官网去下载:官网 也可以去:CSDN下载链接 安装的过程中附加选项可以都选,会安装wireshark,solarwinds等等,如果已经安装,可以根据提示取消. 2.安装ios 安装完 ...

最新文章

  1. 仿人智能控制器的参数简化(已发表于《计算机测量与控制》2013年第4期)
  2. linux中查看文件内容常用的命令
  3. TCP-IP详解:重传机制
  4. Windows、Linux系统安装JDK配置Java环境变量
  5. 这几个在搞低功耗广域网的,才是物联网的黑马
  6. 复函数图像怎么画_...1等等.只需大致图象,和大致画法(根据原函数就能画出复合函数的...-复函数的图形-数学-禄凡闷同学...
  7. web——Tomcat Maven插件及Servlet入门
  8. java 旅行家的预算_洛谷 P1016 旅行家的预算 Java解法
  9. php scsi平台,三大SCSI Target平台PK:让服务器化身SAN
  10. 【计算机视觉】【车辆识别】--Matlab实现
  11. linux 安装redis_Linux安装redis及安装php-redis扩展
  12. fedora yum 安装mysql
  13. 【官方速报】360开源又一力作——KafkaBridge:让操作kafka更简单!
  14. RocketMq学习笔记001---Kafka,ActiveMQ、RabbitMQ、RocketMQ消息中间件的对比
  15. python微信小程序自动化测试,微信小程序的自动化测试框架
  16. 2017年R语言发展报告(国内)
  17. 大华工业相机SDK【QT+ C++】vs2015配置环境
  18. 伊甸园日历游戏 飘飘乎居士拯救MM(tyvj 1968 1140)
  19. 《人类简史》《未来简史》读后感作文5000字
  20. 分分钟安装VMware,并安装linux操作系统

热门文章

  1. windows 7 SP1补丁包 (64位) V 2013.10 官方版
  2. 建模思路|彩色C4D人物元素设计灵感
  3. 社会工程学三本_1.9万人报考,扩招近千人!被戏称为“大三本”的985——东南大学,低调有实力!...
  4. 跨考计算机复试自我介绍,复试之自我介绍_跨考网
  5. 北京妞儿找IT男图的算数思路
  6. Kafka配置动态SASL_SCRAM认证
  7. Java判断字符串包含英文
  8. 现代电子计算机元件的发展从电子管,现代计算机技术的发展方向与趋势探索
  9. InceptionV3实战:tensorflow2.X版本,InceptionV3图像分类任务(大数据集)
  10. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】