Mockito常用方法及示例
Mockit是一个开源mock框架,官网:http://mockito.org/,源码:https://github.com/mockito/mockito
要使用Mockit,首先需要在我们工程中引入对应的jar包,对于maven工程而言,需要添加如下依赖项即可:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.0.5-beta</version>
</dependency>
而在我们实际使用时,为了组织测试case的需要,我们可能还需要testng:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.8</version>
<scope>test</scope>
</dependency>
在进行下面的mock test示例之前,我们先建两个简单的被测类Demo、ParameterClass。
Demo.java:
package com.anlegor.test;
public class Demo {
private String name ="laowang";
private int age;
public Demo(String name, int age) {
this.name = name;
this.age = age;
}
public String speak(String str) {
return str;
}
public String talk(String str)
{
return str;
}
public String methodNoParameters()
{
return name;
}
public String methodCustomParameters(ParameterClass parameter,String str)
{
return str;
}
public String methodHaveChildObj(ParameterClass parameter,String str)
{
parameter.childTalk(str);
return str;
}
}
ParameterClass.java
package com.anlegor.test;
public class ParameterClass {
public ParameterClass() {
}
public String childTalk(String str)
{
return str;
}
}
我们在进行mock的时候,常见会有如下一些场景:
1、 构造无参函数的返回
/**
* 测试无参数函数mock
*/
@Test(priority=0)
public void testReturnDirect()
{
String mocked = "mocked Return";
Demo demo = Mockito.mock(Demo.class);
Mockito.when(demo.methodNoParameters()).thenReturn(mocked);
Assert.assertEquals(demo.methodNoParameters(), mocked);
}
2、构造有基本类型作为参数的返回
/**
* 测试任意基本类型参数函数mock
*/
@Test(priority=1)
public void testMethodWithParameter()
{
String word= "mocked Return";
Demo demo = Mockito.mock(Demo.class);
Mockito.when(demo.speak(Mockito.anyString())).thenReturn(word);
Assert.assertEquals(demo.speak("你好"), word);
}
3、构造有基本类型作为参数,但是只针对特定参数输入才mock返回值
/**
* 测试特定参数mock
*/
@Test(priority=2)
public void testMethodWithSpecificParameter()
{
String word= "mocked Return";
Demo demo = Mockito.mock(Demo.class);
Mockito.when(demo.speak(Mockito.matches(".*大爷$"))).thenReturn(word);
Assert.assertEquals(demo.speak("隔壁李大爷"), word);
}
4、构造自定义类作为函数参数的返回,这种情况稍微复杂一些,需要实现一个matcher类
/**
* 测试自定义类型参数的mock
*/
@Test(priority=3)
public void testMethodWithCustomParameter()
{
String word= "mocked Return";
Demo demo = Mockito.mock(Demo.class);
Mockito.when(demo.methodCustomParameters(Mockito.argThat(new IsParameterClass()),
Mockito.anyString())).thenReturn(word);
Assert.assertEquals(demo.methodCustomParameters(new ParameterClass(), "你猜"), word);
}
//自定义一个与之匹配的matcher类
class IsParameterClass extends ArgumentMatcher<ParameterClass> {
public boolean matches(Object para) {
return para.getClass() == ParameterClass.class;
}
}
5、构造null返回
/**
* 测试mock的函数返回null
*/
@Test(priority=4)
public void testMethodWithReturnNull()
{
String word= "mocked Return";
Demo demo = Mockito.mock(Demo.class);
Mockito.when(demo.speak(Mockito.anyString())).thenReturn(null);
Assert.assertNotEquals(demo.speak("你猜"), word);
}
6、构造mock的函数抛出异常,当然我们可以在testng中设置expectedExceptions以显示声明会抛出指定类型的异常,这样该条case执行的时候就会成功
/**
* 测试mock的函数抛出异常
*/
@Test(expectedExceptions=org.mockito.exceptions.base.MockitoException.class,priority=5)
public void testMethodReturnException()
{
String word= "mocked Return";
Demo demo = Mockito.mock(Demo.class);
Mockito.when(demo.speak(Mockito.anyString())).thenThrow(new Exception());
demo.speak("你猜");
}
7、某些反复调用,我们希望对于每次调用都返回不同的mock值
/**
* 测试mock的不同次调用返回不同的值
*/
@Test(priority=6)
public void testMethodMultiDiffReturn()
{
String word= "mocked Return 0";
String word1= "mocked Return 1";
Demo demo = Mockito.mock(Demo.class);
Mockito.when(demo.speak(Mockito.anyString())).thenReturn(word).thenReturn(word1);
Assert.assertEquals(demo.speak("你猜"), word);
Assert.assertEquals(demo.speak("你猜"), word1);
}
8、验证函数执行是否经过了mock
/**
* 验证方法是否被mock且是否为所执行的参数调用
*/
@Test(expectedExceptions= org.mockito.exceptions.misusing.NotAMockException.class,priority=7)
public void testMockedMethodRun()
{
String word= "mocked Return";
Demo demo = Mockito.mock(Demo.class);
Mockito.when(demo.speak(Mockito.anyString())).thenReturn(word);
Assert.assertEquals(demo.speak("你猜"), word);
Mockito.verify(demo.speak("你猜"));
//下面这个参数的方法调用并没有被执行过,所以会抛出NotAMockException的异常
Mockito.verify(demo.speak("nicai"));
}
如果对于上面的反复使用Mockito.when***的写法很厌烦的话,就直接静态导入org.mockito.Mockito.*即可。
当然,mockito的作用也不仅仅如上面,更详细的使用可以 参考它很详细的帮助文档:
http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html
---------------------
作者:anlegor
来源:CSDN
原文:https://blog.csdn.net/Anlegor/article/details/44452011
版权声明:本文为博主原创文章,转载请附上博文链接!
Mockito常用方法及示例的更多相关文章
- C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式
C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式 C#实现自动启动的方法-两种方法 源码下载地址: ...
- Spring JDBC常用方法详细示例
Spring JDBC使用简单,代码简洁明了,非常适合快速开发的小型项目.下面对开发中常用的增删改查等方法逐一示例说明使用方法 1 环境准备 启动MySQL, 创建一个名为test的数据库 创建Mav ...
- Date和Calendar时间操作常用方法及示例
package test; import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date; /** ...
- UITableView的常用方法与示例
实例方法 dequeueReusableCellWithIdentifier: 初始化一个指定重用标识符的UITableCell对象 两个协议 UITableViewDataSource tableV ...
- python random模块(获取随机数)的常用方法及示例
random.randomrandom.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 random.uniformrandom.uniform(a, b),用 ...
- pandas 常用方法使用示例
from pandas import DataFrame import numpy as np import pandas as pd t={ , , np.nan, , np.nan, ], &qu ...
- php操作redis常用方法代码示例
redis 的连接 描述:实例连接到一个Redis. 参数:host: string,port: int 返回值:BOOL 成功返回:TRUE;失败返回:FALSE $redis = new Red ...
- Mockito:一个强大的用于Java开发的模拟测试框架
https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...
- 单元测试利器Mockito框架
什么是Mock Mock 的中文译为仿制的,模拟的,虚假的.对于测试框架来说,即构造出一个模拟/虚假的对象,使我们的测试能顺利进行下去. Mock 测试就是在测试过程中,对于某些 不容易构造(如 Ht ...
随机推荐
- C#学习-接口的成员
在接口中定义方法不能添加任何访问修饰符,因为接口中的方法是默认为public,如果显式地指定了修饰符,则会出现编译时错误. 定义玩接口之后,如果有类想继承该接口,则它必须显示接口中定义的所有方法. 在 ...
- [转] 微信小程序页面间通信的5种方式
微信小程序页面间通的5种方式 PageModel(页面模型)对小程序而言是很重要的一个概念,从app.json中也可以看到,小程序就是由一个个页面组成的. 如上图,这是一个常见结构的小程序:首页是一个 ...
- 辅助排序和Mapreduce整体流程
一.辅助排序 需求:先有一个订单数据文件,包含了订单id.商品id.商品价格,要求将订单id正序,商品价格倒序,且生成结果文件个数为订单id的数量,每个结果文件中只要一条该订单最贵商品的数据. 思路: ...
- [Sublime]Sublime安装以及插件使用
安装直接去官网下载安装了 安装Package Control关于安装Package Control,有两种方法. 一.自动安装 自动安装很方便,网上代码很多.我用的是Sublime Text3,通过V ...
- react的Virtual DOM
一.Virtual DOMVirtual DOM是一个JavaScript对象,v8引擎使得js可以高效运行,而直接操作DOM很慢.Virtual DOM本质上就是在JS和DOM之间做了一个缓存.可以 ...
- 2019-2-20C#开发中常用加密解密方法解析
C#开发中常用加密解密方法解析 一.MD5加密算法 我想这是大家都常听过的算法,可能也用的比较多.那么什么是MD5算法呢?MD5全称是 message-digest algorithm 5[|ˈmes ...
- Object 中 equals()使用
详细看: https://www.cnblogs.com/naihuangbao/p/9445027.html 1. ==是判断两个变量或实例是不是指向同一个内存空间equals是判断两个变量或实例所 ...
- Django——图书管理系统
基于Django的图书管理系统 1.主体功能 1.列出图书列表.出版社列表.作者列表 2.点击作者,会列出其出版的图书列表 3.点击出版社,会列出旗下图书列表 4.可以创建.修改.删除 图书.作者.出 ...
- UWB DWM1000 智能跟踪小车 --[蓝点无限]
蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 UWB 智能跟踪小车:一共三个UWB模块,手持一个,小车上两个. 通过测量小车上两个模块与手持模块之间的距离, ...
- Do-Now—团队Scrum 冲刺博客五
各个成员今日完成的任务 侯泽洋: 每日任务页面编写,任务修改功能 周亚杰:完成个人中心页面设计 王志伟:完成个人中心页面设计 唐才铭:启动动画及引导页与项目合并 项目燃尽图 站立式会议照片 各个成员遇 ...