Mockito 的使用
转自:Mockito 中文文档 ( 2.0.26 beta )
转自:手把手教你 Mockito 的使用
参数匹配器
Argument Matcher(参数匹配器)
@Test public void argumentMatchersTest(){ List<String> mock = mock(List.class); when(mock.get(anyInt())).thenReturn("Hello").thenReturn("World"); String result=mock.get(100)+" "+mock.get(200); verify(mock,times(2)).get(anyInt()); assertEquals("Hello World",result); }
@Test public void argumentMatchersTest(){ Map mapMock = mock(Map.class); when(mapMock.put(anyInt(), anyString())).thenReturn("world"); mapMock.put(1, "hello"); verify(mapMock).put(anyInt(), eq("hello")); }
在最后的验证时如果只输入字符串”hello”是会报错的,必须使用Matchers类内建的eq方法。如果将anyInt()换成1进行验证也需要用eq(1)。
自定义匹配器-ArgumentMatcher抽象类
自定义参数匹配器的时候需要继承ArgumentMatcher抽象类,它实现了Hamcrest框架的Matcher接口,定义了describeTo方法,所以我们只需要实现matches方法在其中定义规则即可。
下面自定义的参数匹配器是匹配size大小为2的List:
1 class IsListOfTwoElements extends ArgumentMatcher<List> { 2 @ 3 public boolean matches(Object list) { 4 return ((List) list).size() == 2; 5 } 6 } 7 8 @Test 9 public void argumentMatchersTest(){ 10 List mock = mock(List.class); 11 when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true); 12 13 mock.addAll(Arrays.asList("one", "two", "three")); 14 verify(mock).addAll(argThat(new IsListOfTwoElements())); 15 }
argThat(Matcher<T> matcher)方法用来应用自定义的规则,可以传入任何实现Matcher接口的实现类。上例中在stubbing和verify addAll方法时通过argThat(Matcher<T> matcher),传入了自定义的参数匹配器IsListOfTwoElements用来匹配size大小为2的List。因为例子中传入List的元素为三个,所以测试将失败。
较复杂的参数匹配将会降低测试代码的可读性。有时实现参数对象的equals()方法是个不错的选择(Mockito默认使用equals()方法进行参数匹配),它可以使测试代码更为整洁。另外,有些场景使用参数捕获器(ArgumentCaptor)要比自定义参数匹配器更加合适。
如何捕获 mock 方法的调用参数
Mockito以java代码风格的形式来验证参数值 : 即通过使用equals()
函数。这也是我们推荐用于参数匹配的方式,因为这样会使得测试代码更简单、简洁。在某些情况下,当验证交互之后要检测真实的参数值时这将变得有用。例如 :
1 @Test 2 public void captureNonGenericArgument() { 3 UserDao userDao = Mockito.mock(UserDao.class); 4 UserService userService = new UserService(userDao); 5 6 userService.saveUser(new User(null, "Yanbin")); 7 8 ArgumentCaptor<User> argumentCaptor = ArgumentCaptor.forClass(User.class); 9 verify(userDao, times(1)).save(argumentCaptor.capture()); 10 11 assertEquals("Yanbin", argumentCaptor.getValue().name); 12 assertEquals("Chicago", argumentCator.getValue().city); //可断言捕获参数的更多特征
从面对被捕获参数 argumentCaptor.getValue()
的断言可看出它比 argThat()
的优势,argThat() 无法告诉我们不匹配的细节
警告 : 我们建议使用没有测试桩的ArgumentCaptor来验证,因为使用含有测试桩的ArgumentCaptor会降低测试代码的可读性,因为captor是在断言代码块之外创建的。另一个好处是它可以降低本地化的缺点,因为如果测试桩函数没有被调用,那么参数就不会被捕获。总之,ArgumentCaptor与自定义的参数匹配器相关(可以查看ArgumentMatcher类的文档 )。这两种技术都能用于检测外部传递到Mock对象的参数。然而,使用ArgumentCaptor在以下的情况下更合适 :
- 自定义不能被重用的参数匹配器
- 你仅需要断言参数值
我们同样可以在打桩的时候捕获参数,如
1 ArgumentCaptor<User> argumentCaptor = argumentCaptor.forClass(User.class); 2 when(userDao.findUserLike(argumentCaptor.capture)).thenReturn(Mockito.mock(User.class)); 3 4 assertEquals("Yanbin", argumentCaptor.getValue().name);
不能以这种方式在打桩的时候捕获参数:
1 when(userDao.findUserLike(argumentCaptor.capture)).thenReturn(getUser(argumentCaptor.getValue()));
否则会报错:
出错位置在打桩的地方。记住打桩并不等于异步调用,它返回的是个固定值!
转载于:https://www.cnblogs.com/fnlingnzb-learner/p/10595138.html
Mockito 的使用相关推荐
- 单元测试mock之mockito使用
先来一个简单的例子来感受一下 外部接口类:TestService.java 1 package com.yzl.mock; 2 3 /** 4 * 测试用服务 5 * 6 * @author yang ...
- Mockito测试void方法会引发异常
本文翻译自:Mockito test a void method throws an exception I have a method with a void return type. 我有一个vo ...
- 如何使用Mockito模拟void方法
如何用void返回类型模拟方法? 我实现了一个观察者模式,但是我不能用Mockito模拟它,因为我不知道怎么做. 我试图在互联网上找到一个例子,但没有成功. 我的课看起来像这样: public cla ...
- mockito 外部接口_【IDEA开发SpringBoot2.0】使用Mockito进行常规接口测试#05
文章目录 前言[^1] 什么是Mockito? 什么是Mock? 为什么要使用Mock? 用PostMan与用Mock有什么区别? 正题 使用Mockito做一个模拟测试 编写代码 开始测试 代码讲解 ...
- mockito_使用FizzBuzz和Mockito进行单元测试
mockito 我有时使用FizzBuzz向新手演示单元测试的基础. 尽管FizzBuzz确实是一个简单的问题,但是它也可以用于演示更高级的单元测试技术,例如模拟. FizzBuzz Ka ...
- mockito_Eclipse的Mockito模板
mockito 有时候,我想念树林里的树木-那是一段令人不安的长时间. 我最近才再次意识到这一点,在无数次中键入了一个更详细的模拟表达式. 有问题的语句是doAnswer(Answer)构造,使用涉及 ...
- mockito_使用Mockito模拟自动装配的字段
mockito 依赖注入是诸如Spring和EJB之类的Control容器反转的非常强大的功能. 将注入的值封装到私有字段中总是一个好主意. 但是,自动连线字段的封装会降低可测试性. 我喜欢Mocki ...
- mockito mock void方法_一文让你快速上手 Mockito 单元测试框架(上)
作者|mghio 编辑|包包 前言 在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改 ...
- Mockito cannot mock/spy because : - final class 问题
Mockito cannot mock/spy because : - final class 问题 现象: 出现报错,且报错信息如下 Mockito cannot mock/spy because ...
- Mockito 简明教程
原文同步至 http://waylau.com/mockito-quick-start/ Mock 测试是单元测试的重要方法之一.本文介绍了基于 Java 语言的 Mock 测试框架 -- Mocki ...
最新文章
- hookup_2.10-0.2.3.jar包下载
- mysql select符合查询_数据库select group by 和having语句 多表连接查询 复合查询
- mysql表只有frm文件_MYSQL数据文件--.frm文件(只有.frm文件时的表结构恢复)
- 为最快动脉线诊断 铁科院联合第四范式完成高铁智能化巡检应用
- 【详解】以下关于TCP/IP协议栈中协议和层次的对应关系正确的是()
- √2是个无理数,没有尽头,为什么边长为1的直角三角形可以画出来? 是悖论吗?...
- Java多线程相关的几十个问题
- 求单链表结点的阶乘和
- sumif三个条件怎么填_玩转excel求和函数,sumif/sumifs常用案例讲解
- 2013第44周日小结
- Ubuntu修改open files数
- Server(Iocp)的那些烦恼
- Python+Selenium程序执行完,chrome浏览器自动关闭解决方案
- dakai微信小程序 ios_【iOS】微信小程序打开APP到底是怎么回事?
- mysql C openmp_OpenMP: sections分段并行 | 学步园
- PLSQL设置选中字母大小写切换快捷键
- 音视频开发系列(24)使用FFmpeg添加、删除、替换和提取视频中的音频
- python逐行读取excel_用python读取excel需要哪些技能
- 最牛的商业模式,化肥厂利用买化肥送车,一年总利润600多万?
- 湖南文理学院第十六届程序设计竞赛_题解
热门文章
- 通过 PL/SQL Developer 建表
- 浅析 Linux 初始化系统(系统服务管理和控制程序/Init System) -- sysvinit/systemvinit(System V init)
- linux查看文件使用情况,linux查看文件句柄使用情况
- Pytorch机器学习/深度学习代码笔记
- java事件编程_java基础 ---Swing事件编程
- 原生态基于OpenCV图像处理软件开发
- ​嵌入式开发为什么选择C语言?
- ios多线程Android,iOS 关于多线程
- wincc历史数据库_WinCC系统的基本功能介绍——自动化工程师必备
- 机器学习相关知识 大佬博客整理