Mockito是一个模拟框架,可让您使用简洁的API编写漂亮的测试。 它偏向于最低规格,使不同的行为看起来有所不同,并显示清晰的错误消息。

创造嘲弄

要使用Mockito创建模拟,只需使用@Mock注释模拟,然后调用MockitoAnnotations.initMocks(this)

import org.mockito.Mock;
import org.mockito.MockitoAnnotations;public class FooClassTest {@Mock mockFoo;public void setUp() {MockitoAnnotations.initMocks(this);...}...
}

存根值

存根值可以刺激现有代码的行为,或临时替代尚待开发的代码。 默认情况下,对于所有返回值的方法,mock返回null,空集合或适当的原始/原始包装器值(例如:0,false,…)。 您可以按以下方式覆盖存根值。 一旦存根,该方法将始终返回存根值,而不管它被调用了多少次。 对于具有无效返回值的方法,通常不需要将其存根。

import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.when;
...
// a method that returns values
when(mockFoo.someCall()).thenReturn(someValue);
when(mockFoo.someCall()).thenThrow(new FooException());
// a method with a void return
doThrow(new FooException()).when(mockFoo).voidMethodThatThrows();

验证方法是否被调用

// call the subject under test
verify(mockFoo, times(2)).someCall();
verify(mockFoo).someCall();
verify(mockFoo).callWithVoidReturnType();

“粗略”和“验证”有什么区别? 简而言之,对于您并不真正关心的项目,应使用“存根”,但它们必须通过测试。 相反,应使用“验证”来验证行为。

验证单个对象的调用顺序

InOrder order1 = Mockito.inOrder(mockFoo);
order1.verify(mockFoo).firstCall();
order1.verify(mockFoo).thirdCall();InOrder order2 = Mockito.inOrder(mockFoo);
order2.verify(mockFoo).secondCall();
order2.verify(mockFoo).fifthCall();

验证跨多个对象的调用顺序

Foo mockFoo = Mockito.mock(Foo.class);
Bar mockBar = Mockito.mock(Bar.class);// call the subject under test
InOrder order = Mockito.inOrder(mockFoo, mockBar)
order.verify(mockFoo).firstCall();
order.verify(mockBar).secondCall();

验证仅进行了预期的呼叫

通常,不再进行交互的测试应该很少。

// call the subject under test
verify(mockFoo).expectedCall();
verify(mockFoo).someOtherExpectedCall();
verifyNoMoreInteractions(mockFoo);

验证未拨打特定电话

测试未发出特定呼叫通常比检查“不再有呼叫”要好。

// call the subject under test
verify(mockStream, never()).close();

匹配器

==equals不能用于存根或验证时,我们可以将匹配器用于模拟方法参数。 如果您发现需要复杂的匹配器,请考虑简化您的测试对象或测试,或者考虑使用手工制作的假冒代替模拟。

import static org.mockito.Mockito.*;// Both of these forms use "equals"
when(mockFoo.set("blah", 2)).thenReturn(value);
when(mockFoo.set(eq("blah"), eq(2))).thenReturn(value);when(mockFoo.set(contains("la"), eq(2))).thenReturn(value);
when(mockFoo.set(eq("blah"), anyInt())).thenReturn(value);
when(mockFoo.set(anyObject(), eq(2))).thenReturn(value);
when(mockFoo.set(isA(String.class), eq(2))).thenReturn(value);
when(mockFoo.set(same(expected), eq(2))).thenReturn(value);ArgumentCaptor<String> sArg = ArgumentCaptor.forClass(String.class);
when(mockFoo.set(sArg.capture(), eq(2))).thenReturn(value);
...
// returns last captured value
String capturedString = sArg.getValue();
List<String> capturedStrings = sArg.getAllValues();

局部嘲弄

使用spyCALLS_REAL_METHODS ,您可能希望使用不调用现有方法或存根的备用存根语法: doReturn("The spy has control.").when(mockFoo).aMethod()

import org.mockito.Mockito;Foo mockFoo = Mockito.spy(new Foo()); // Note: instance, not class.
// Note: "when" calls the real method, see tip below.
when(mockFoo.aMethod()).thenReturn("The spy has control.");
// call the subject under test
verify(mockFoo).aMethod();
// Verify a call to a real method was made.
verify(mockFoo).someRealMethod();
// Alternative construct, that will fail if an unstubbed abstract
// method is called.
Foo mockFoo = Mockito.mock(Foo.class, Mockito.CALLS_REAL_METHODS);

翻译自: https://www.javacodegeeks.com/2014/09/mockito-101.html

Mockito 101相关推荐

  1. Java测试-mockito学习

    目录 1 Mockito 2 各种模拟使用 2.1 mock接口并验证 2.2 mock具体类,并进行stub 2.3 参数匹配器-Argument matchers 2.4 验证实际调用的次数 2. ...

  2. 仙居机器人_【101巨喜讯】又一个全国冠军!仙居学子机器人全国赛获奖啦!

    原标题:[101巨喜讯]又一个全国冠军!仙居学子机器人全国赛获奖啦! 仙居私家车广播 美丽仙居,品质广播!欢迎关注仙居最具品质广播微信公众号! 特大喜讯 ! 浙江仙居城峰中学.仙居机器人协会7名学生 ...

  3. Maya 2020面部绑定动画学习视频教程 Facial Rigging 101 – Maya 2020

    Maya 2020面部绑定动画学习视频教程 Facial Rigging 101 – Maya 2020 时长:16h 55m |视频:. MP4 1280x720,30 fps(r) |音频:AAC ...

  4. 学习 Linux,101: 引导系统

    2019独角兽企业重金招聘Python工程师标准>>> 系列文章: http://www.ibm.com/developerworks/cn/views/linux/libraryv ...

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

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

  6. 二次开发photoshop_Photoshop 101:Web开发人员简介

    二次开发photoshop 介绍 (Introduction) Often, when working as web developer, we need to integrate templates ...

  7. Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误

    这篇是计算机类的优质预售推荐>>>><Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误> 编辑推荐 纠错式学习,从"陷阱 ...

  8. Python分析101位《创造营2020》小姐姐,谁才是你心中的颜值担当?

    来源 | CDA 数据分析师 责编 |  Carol Show me data,用数据说话. 今天我们聊一聊<创造营2020>各个小姐姐,点击下方视频,先睹为快: 最近可以追的综艺真是太多 ...

  9. 研发管理101军规#003 实战规模化敏捷:从8人到百人的敏捷之路

    ​这是研发管理101的第三篇 如果用一句话概述本篇的主题,那就是:关注8人团队的自组织性,构建百人团队的研发工作流. Worktile是在15年的时候引入的Scrum.在那之前我们并没有采用标准的敏捷 ...

最新文章

  1. 10个非常有趣的Linux命令
  2. Android网络连接判断与处理
  3. DL框架之PyTorch:深度学习框架PyTorch的简介、安装、使用方法之详细攻略
  4. Git操作失败并提示Another git process seems to be running in this......
  5. vector与list的接口介绍与如何使用以及区别,附代码。
  6. oracle_最常见的 5 个导致节点重新启动、驱逐或 CRS 意外重启的问题
  7. Coinbase及Bakkt为Paul Tudor Jones的家族对冲基金提供托管服务
  8. gdb在cygwin下的安装
  9. Python20行代码爬取搞笑图片—拯救你的不开心
  10. 机器人开发--技术路线简介
  11. BP神经网络python的实现
  12. 免费搭建个人网站流程!马上拥有自己的网站!
  13. npm create vite@latest 失败
  14. CSS 单(多)行文本超过部分显示省略号,解决数字或英文不换行问题
  15. android 限制后台进程,Android O Preview 相关-后台执行限制
  16. 计划任务linux每天执行一次,linux 每天执行任务计划
  17. 前端HTML CSS JavaScipt JQuery
  18. 快来打造属于自己的天猫精灵
  19. 国产开源项目管理软件ZenTao
  20. 二元函数对xy同时求导_关于反三角函数及其导数

热门文章

  1. 2017蓝桥杯省赛---java---B---3(承压计算)
  2. 迷宫问题---递归解决
  3. Axios实现异步通信
  4. 面试官角度的JVM面试
  5. linux u32,如何在程序中使用u32这个类型啊。
  6. 华为云微认证答题_158人次通过华为认证考试!今年,湖北这所高校频现大动作...
  7. DFS应用——查找强分支
  8. 清洁代码_清洁单元测试
  9. corda_Corda服务的异步流调用
  10. apache camel_Apache Camel中的短重试与长重试