mockito测试入门学习
一、什么是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测试入门学习的更多相关文章
- Android测试入门学习
一,Android测试新人练习——安装及文件传输 [课前准备] Android测试环境搭建 1.下载并安装JDK: http://www.oracle.com/technetwork/java/jav ...
- PyQt4入门学习笔记(一)
PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...
- MyBatis入门学习教程-使用MyBatis对表执行CRUD操作
上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...
- opengl入门学习
OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...
- MyBatis入门学习(二)
在MyBatis入门学习(一)中我们完成了对MyBatis简要的介绍以及简单的入门小项目测试,主要完成对一个用户信息的查询.这一节我们主要来简要的介绍MyBatis框架的增删改查操作,加深对该框架的了 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- ReactJS入门学习一
ReactJS入门学习一 阅读目录 React是什么? React如何制作组件? 理解组件属性props 理解页面中如何渲染数据的 理解从服务器端获取数据及理解state的 回到顶部 React是什么 ...
- Android渗透测试Android渗透测试入门教程大学霸
Android渗透测试Android渗透测试入门教程大学霸 第1章 Android渗透测试 Android是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机.平板等.目前 ...
- OpenGL入门学习(转)
OpenGL入门学习 http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 说起编程作图,大概还有很多人想起TC的#includ ...
随机推荐
- PHP/HTML混写的四种方式
[整理]PHP/HTML混写的四种方式 PHP作为一款后端语言,为了输出给浏览器让浏览器呈现出来,无可避免的要输出HTML代码,下文介绍下我用过的三种PHP/HTML混编方法 1.单/双引号包围法 ...
- P2639 [USACO09OCT]Bessie的体重问题Bessie's Weight
题目传送门 这题和01背包最大的区别在于它没有价值,所以我们可以人工给它赋一个价值,由于要求体积最大,把价值赋成体积即可.顺带一提,这题数据范围很大,二维会MLE,要压缩成一维才可以AC 下面给出参考 ...
- 浅谈随机数发生器(C语言)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/svitter/article/details/30971395 本文出自:点击打开链接 本来在做数据 ...
- SpringBoot-技术专区-详细打印启动时异常堆栈信息
SpringBoot在项目启动时如果遇到异常并不能友好的打印出具体的堆栈错误信息,我们只能查看到简单的错误消息,以致于并不能及时解决发生的问题,针对这个问题SpringBoot提供了故障分析仪的概念( ...
- 连接tomcat时,输入telnet localhost 8080后无法再次输入
初次接触服务器时,一般会在本地建立一个微型服务器,今天在使用Apache的tomcat时,为了在命令行下访问服务器中webapps下的自定义资源:首先打开命令行窗口,然后输入telnet localh ...
- linux 日常学习
杀掉进程 ps aux |grep caddy axy5418+ 14186 0.0 1.7 117032 10372 ? Sl 02:17 0:00 caddy axy5418+ 14332 0.0 ...
- winform中进行post上传文件
winform中要上传文件到远程的服务器上面,我在本地用的是post方式传递数据,用的是HTTP协议,具体代码如下: 下面的代码就是一个上传的方法,参数需要路径和文件路径就可以了,我本地winform ...
- Django 项目环境搭建
环境 mkvirtualenv -p python3.6 mytest # 创建虚拟环境 workon mytest # 进入虚拟环境 # 按照基础环境依赖 pip install django==1 ...
- usb server新产品(旧老板设备)-给自己一个学习硬件的动力
- 简单说下cookie,LocalStorage与SessionStorage.md
最近在网上看到有人讨论这三个的一些概念与区别,发现自己也一直没有较好的总结,所以查阅了一些资料来阐述一下. 基本概念 cookie cookie英文意思是小甜饼,是原来的网景公司创造,目前是在客户端存 ...