一、什么是mock测试,什么是mock对象?

先来看看下面这个示例:

从上图可以看出如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例。

一种替代方案就是使用mocks

从图中可以清晰的看出

mock对象就是在调试期间用来作为真实对象的替代品。

mock测试就是在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。

知道什么是mock测试后,那么我们就来认识一下mock框架---Mockito

二、什么是Mockito

除了有一个好记的名字外,Mockito尝试用不一样的方法做mocking测试,是简单轻量级能够替代EasyMock的框架。使用简单,测试代码可读性高,丰富的文档包含在javadoc中,直接在IDE中可查看文档,实例,说明。

Mockito.when(mockService.queryInfo(Mockito.any(QueryCod.class))).thenReturn(uInfo);
mockService为接口;
queryInfo是mockService接口里的方法;
QueryCod是方法queryInfo的入参,是一个class对象;且只有一个入参。
uInfo是方法queryInfo的执行结果,uInfo是mock的一个结果。

Mockito.when(mockQueryFacade.queryByRoleId(Mockito.anyString(),Mockito.any(QueryContext.class))).thenReturn(QueryResult);

mockQueryFacade是接口;
queryByRoleId是mockQueryFacade接口里的方法;
queryByRoleId方法有两个入参,
QueryResult queryByRoleId(String roleId, QueryContext context);两个入参均mock。
QueryResult为查询的结果。
需要导入
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import java.util.Iterator;
import org.junit.Test;
mock可以模拟各种各样的对象,替代真正的对象做出希望的响应。
使用mockito的方法:
1、使用mock()模拟对象。
//模拟LinkList的一个对象
LinkedList mockdedList = mock(LinkedList.class);
//此时条用get方法,会返回null,因为还没有对方法调用的返回值做模拟。
System.out.printlin(mockedList.get(99));
2、指定mock对象被调用时的返回值。
a、模拟,方法调用的返回值。
//模拟获取第一个元素时,返回字符串first。给特定的方法调用返回固定值,在官方说法中称stub。
(stub,为屏蔽客户调用远程主机上的对象,必须提供某些方式来模拟本地对象,这种本地对象称为存根stub)
when(mockedList.get(0).thenReturn("first"));
//此时打印输出first
System.out.println(mockedList.get(0));
b、模拟,方法调用抛出异常
//模拟获取第二个元素时,抛出RuntimeException
when(mockedList.get(1)).thenThrow(new RuntimeException);
//此时抛出RuntimeException异常
System.out.println(mockedList.get(1)); 没有返回值类型的方法也可以模拟异常抛出:
doThrow(new RuntimeException()).when(mockedList).clear();
c、模拟调用方法时的参数匹配
//anyInt()匹配任何int参数,这表示参数为任何值,均返回element
when(mockedList.get(anyInt())).thenReturn("element");
//此时打印是element
System.out.println(mockedList.get(99));
d、模拟方法调用次数
//调用add一次
mockedList.add("once");
//验证add方法是否被调用了一次,两种写法效果一样
verify(mockedList)add("once");
verify(mockedList,times(1)).add("once");
还可以通过atLeast(int i)和taMost(int i)来验证被调用的次数的最小值和最大值
3、验证被测试类是否正确工作,使用verify()。 默认情况下,对于所有的有返回值且没有stub过的地方,mockito会返回相应的默认值,
对于内置类型会返回默认值,如int会返回0,布尔值返回false,对于其他type会返回null。
mock对象会覆盖整个被mock的对象,因此没有stub的方法只能返回默认值。
//重复stub两次,则以第二次为准,如下将返回”second“
when(mockedList.get(0)).thenReturn("first");
when(mockedList.get(0)).thenReturn("second");
//下面这种形式表示第一次调用返回”first“,第二次调用返回”second“,可以写n多个
when(mockedList.get(0)).thenReturn("first").thenReturn("second");
如果实际调用次数超过了stub过的次数,则会一直返回最后一次stub的值,如上例,第三次调用get(0),则返回 ”second“ 验证方法被调用了特定的次数
//验证add方法被调用了两次
verify(mockedList,times(2)).add("2");
//验证add方法致至少被调用一次
verify(mockedList.atLeastOnce()).add("2");
//验证add方法至少被调用两次
verify(mockedList,atLeast(2)).add("2");
//验证add方法最大被调用5次
verify(mockedList,atMost(5)).add("2");
//验证add方法从未被调用
vreify(mockedList,never()).add("2");找到冗余的调用,使用never();

mockito测试入门学习的更多相关文章

  1. Android测试入门学习

    一,Android测试新人练习——安装及文件传输 [课前准备] Android测试环境搭建 1.下载并安装JDK: http://www.oracle.com/technetwork/java/jav ...

  2. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  3. MyBatis入门学习教程-使用MyBatis对表执行CRUD操作

    上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...

  4. opengl入门学习

    OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...

  5. MyBatis入门学习(二)

    在MyBatis入门学习(一)中我们完成了对MyBatis简要的介绍以及简单的入门小项目测试,主要完成对一个用户信息的查询.这一节我们主要来简要的介绍MyBatis框架的增删改查操作,加深对该框架的了 ...

  6. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  7. ReactJS入门学习一

    ReactJS入门学习一 阅读目录 React是什么? React如何制作组件? 理解组件属性props 理解页面中如何渲染数据的 理解从服务器端获取数据及理解state的 回到顶部 React是什么 ...

  8. Android渗透测试Android渗透测试入门教程大学霸

    Android渗透测试Android渗透测试入门教程大学霸 第1章  Android渗透测试 Android是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机.平板等.目前 ...

  9. OpenGL入门学习(转)

    OpenGL入门学习 http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 说起编程作图,大概还有很多人想起TC的#includ ...

随机推荐

  1. Oracle-随笔笔记

    1.重命名数据库表.重命名字段 alter table tablename1 rename to tablename2; alter table tablename1 rename column co ...

  2. [BZOJ2438]杀人游戏

    Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是 ...

  3. Tensorflow机器学习入门——MINIST数据集识别

    参考网站:http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html #自动下载并加载数据 from tensorflow.example ...

  4. python学习第三十一天函数的嵌套及函数的作用域

    python函数的嵌套是指在函数里面嵌套另外一个函数,可以嵌套更多,函数一旦套用了另外一个函数,他的作用域就已经形成,可以通过global关键词改变变量的作用域,下面详细说明函数的嵌套及函数的作用域 ...

  5. 更新252板子代码(前端+cgi中间件)

    1.前端代码 前端的html.css.js代码,利用打包工具生成dist文件夹,放入lighttpd的指定目录. 2.cgi中间件 1)编译 1.下载代码工程V100R100C00 2.将工程代码以共 ...

  6. Python Web开发:使用Django框架创建HolleWorld项目

    开发环境搭建 Python环境安装 下载地址:https://www.python.org/downloads// Django安装 打开Windows CMD输入pip install django ...

  7. 121-基于TI DSP TMS320DM8148的全高清1080P 60fs的视频编解码系统 机器人主板

    基于TI DSP TMS320DM8148的全高清1080P 60fs的视频编解码系统 一.板卡概述 本系统基于最先进的DSP技术,构建一个全高清的视频编解码系统,采用TI的芯片.借助TI的DaVin ...

  8. 四 shell基本命令

    一   内置命令 hlep 命令  帮助 help test help -s printf   显示内置命令的语法格式 echo 用来显示一行文字 echo "hello world&quo ...

  9. Codefroces 958C2 - Encryption (medium) 区间dp

    转自:https://www.cnblogs.com/widsom/p/8857777.html     略有修改 题目大意: n个数,划分为k段,每一段的和mod p,求出每一段的并相加,求最大是多 ...

  10. centos7安装nginx并配置web前端环境。

    1.安装nginx -sudo yum install nginx 2.启动nginx - systemctl start nginx 3.修改nginx路径配置,/etc/nginx/nginx.c ...