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常用方法及示例的更多相关文章

  1. C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式

    C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式 C#实现自动启动的方法-两种方法 源码下载地址: ...

  2. Spring JDBC常用方法详细示例

    Spring JDBC使用简单,代码简洁明了,非常适合快速开发的小型项目.下面对开发中常用的增删改查等方法逐一示例说明使用方法 1 环境准备 启动MySQL, 创建一个名为test的数据库 创建Mav ...

  3. Date和Calendar时间操作常用方法及示例

    package test; import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date; /** ...

  4. UITableView的常用方法与示例

    实例方法 dequeueReusableCellWithIdentifier: 初始化一个指定重用标识符的UITableCell对象 两个协议 UITableViewDataSource tableV ...

  5. python random模块(获取随机数)的常用方法及示例

    random.randomrandom.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 random.uniformrandom.uniform(a, b),用 ...

  6. pandas 常用方法使用示例

    from pandas import DataFrame import numpy as np import pandas as pd t={ , , np.nan, , np.nan, ], &qu ...

  7. php操作redis常用方法代码示例

     redis 的连接 描述:实例连接到一个Redis. 参数:host: string,port: int 返回值:BOOL 成功返回:TRUE;失败返回:FALSE $redis = new Red ...

  8. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  9. 单元测试利器Mockito框架

    什么是Mock Mock 的中文译为仿制的,模拟的,虚假的.对于测试框架来说,即构造出一个模拟/虚假的对象,使我们的测试能顺利进行下去. Mock 测试就是在测试过程中,对于某些 不容易构造(如 Ht ...

随机推荐

  1. 金蝶K/3 报销相关SQL语句

    金蝶K/3 报销相关SQL语句 use AIS20180607113701 select fopenid,* from dbo.t_XunTong_User where Fname ='' go us ...

  2. Knockout中ko.utils中处理数组的方法集合

    每一套框架基本上都会有一个工具类,如:Vue中的Vue.util.Knockout中的ko.utils.jQuery直接将一些工具类放到了$里面,如果你还需要更多的工具类可以试试lodash.本文只介 ...

  3. 解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口(原创)

    这几天用到了微信企业付款到零钱这个接口,结果出现了报错:CA_ERROR, 该接口的API说明和报错提示说明:https://pay.weixin.qq.com/wiki/doc/api/tools/ ...

  4. WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!问题

    ➜ web_develop git:(master) ✗ ssh root@172.16.146.143@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  5. Codeforces 700E. Cool Slogans 字符串,SAM,线段树合并,动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF700E.html 题解 首先建个SAM. 一个结论:对于parent树上任意一个点x,以及它所代表的子树内任 ...

  6. 异常之Tomcat8

    在部署新项目后,启动tomcat突然报出如下错误: 问题:Publishing failed Could not publish to the server. Cannot acquire J2EEF ...

  7. Windows Vue 安装

    https://nodejs.org/dist/v6.9.5/node-v6.9.5-x64.msi 新建文件夹 node_global新建文件夹 node_cachenpm config set p ...

  8. Pok 使用指南

    Pok 使用指南 POK 是一个开源的符合ARINC653的操作系统,因为一些原因,我要开始接触一个全新的领域,再此希望记录下每天点滴进步,同时也欢迎指正吧. 目前先简单说明POK的使用指南 获取源码 ...

  9. springboot 使用 swagger2

    段时间,同事分享了一下 swagger-ui,于是自己尝试了一下.大致的使用过程这里记录一下: 1.添加依赖 <!--swagger-ui--><dependency> < ...

  10. (73)Wangdao.com第十二天_JavaScript consol 对象与控制台

    consol 对象 console对象是 JavaScript 的原生对象 它有点像 Unix 系统的标准输出stdout和标准错误stderr, 可以输出各种信息到控制台,并且还提供了很多有用的辅助 ...