单元测试系列:Mock工具之Mockito实战

时间:2022-04-07 08:01:37

看完点个赞呗,难道想白嫖不成?更多内容请访问微信公众号 :三国测,扫码关注哟!

单元测试系列:Mock工具之Mockito实战

原文链接:http://www.cnblogs.com/zishi/p/6780719.html

在实际项目中写单元测试的过程中我们会发现需要测试的类有很多依赖,这些依赖项又会有依赖,导致在单元测试代码里几乎无法完成构建,尤其是当依赖项尚未构建完成时会导致单元测试无法进行。为了解决这类问题我们引入了Mock的概念,简单的说就是模拟这些需要构建的类或者资源,提供给需要测试的对象使用。业内的Mock工具有很多,也已经很成熟了,这里我们将直接使用最流行的Mockito进行实战演练,完成mockito教程。

Mock工具概述

1.1  Mockito简介

单元测试系列:Mock工具之Mockito实战

EasyMock 以及 Mockito 都因为可以极大地简化单元测试的书写过程而被许多人应用在自己的工作中,但是这两种 Mock 工具都不可以实现对静态函数、构造函数、私有函数、Final 函数以及系统函数的模拟,但是这些方法往往是我们在大型系统中需要的功能。

另外,关于更多Mockito2.0新特性,参考官方介绍文档,里边有关于为什么不mock private的原因,挺有意思的:

https://github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2

1.2 Mockito准备工作

###Maven###

通过Maven管理的,需要在项目的Pom.xml中增加如下的依赖:

 <dependencies>

<dependency>

<groupId>org.mockito</groupId>

<artifactId>mockito-core</artifactId>

<version>2.7.19</version>

<scope>test</scope>

</dependency>

</dependencies>

在程序中可以import org.mockito.Mockito,然后调用它的static方法。

Maven用户可以声明对mockito-core的依赖。 Mockito自动发布到Bintray的中心,并同步到Maven Central Repository。

特别提醒:使用手工依赖关系管理的Legacy构建可以使用1. *“mockito-all”分发。 它可以从Mockito的Bintray存储库或Bintray的中心下载。 在但是Mockito 2. * “mockito-all”发行已经停止,Mockito 2以上版本使用“mockito-core”。

官网下载中心:

http://search.maven.org/#search|gav|1|g%3A%22org.mockito%22%20AND%20a%3A%22mockito-core%22

目前最新版本为2.7.19,由于公司网络网关问题,最好是去官网手工下载。

aaarticlea/png;base64,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" alt="" />

另外Mockito需要Junit配合使用,在Pom文件中同样引入:

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

然后为了使代码更简洁,最好在测试类中导入静态资源,还有为了使用常用的junit关键字,也要引入junit的两个类Before和Test:

import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;

1.3 模拟对象

创建 Mock 对象的语法为 mock(class or interface)。

Mock 对象的创建

mock(Class classToMock);
mock(Class classToMock, String name)
mock(Class classToMock, Answer defaultAnswer)
mock(Class classToMock, MockSettings mockSettings)
mock(Class classToMock, ReturnValues returnValues)

可以对类和接口进行mock对象的创建,创建时可以为mock对象命名。对mock对象命名的好处是调试的时候容易辨认mock对象。

Mock对象的期望行为和返回值设定

假设我们创建了LinkedList类的mock对象:

LinkedList mockedList = mock(LinkedList.class);

1.4 设置对象调用的预期返回值

通过 when(mock.someMethod()).thenReturn(value) 来设定 Mock 对象某个方法调用时的返回值。我们可以看看源码中关于thenReturn方法的注释:

单元测试系列:Mock工具之Mockito实战

使用when(mock.someMethod()).thenThrow(new RuntimeException) 的方式来设定当调用某个方法时抛出的异常。

单元测试系列:Mock工具之Mockito实战

以及Answer:

单元测试系列:Mock工具之Mockito实战

Answer 是个泛型接口。到调用发生时将执行这个回调,通过  Object[] args = invocation.getArguments();可以拿到调用时传入的参数,通过 Object mock = invocation.getMock();可以拿到mock对象。

有些方法可能接口的参数为一个Listener参数,如果我们使用Answer打桩,我们就可以获取这个Listener,并且在Answer函数中执行对应的回调函数,这对我们了解函数的内部执行过成有很大的帮助。

使用doThrow(new RuntimeException(“clear exception”)).when(mockedList).clear();mockedList.clear();的方式Mock没有返回值类型的函数:

aaarticlea/png;base64,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" alt="" />

doThrow(new RuntimeException()).when(mockedList).clear();

//将会 抛出 RuntimeException:

mockedList.clear();

这个实例表示当执行到mockedList.clear()时,将会抛出RuntimeException。其他的doXXX执行与它类似。

例如 : doReturn()|doThrow()| doAnswer()|doNothing()|doCallRealMethod() 系列方法。

Spy函数:

你可以为真实对象创建一个监控(spy)对象,当你使用这个spy对象时,真实的对象也会被调用,除非它的函数被打桩。你应该尽量少的使用spy对象,使用时也需要小心,例如spy对象可以用来处理遗留代码,Spy示例如下:

List list = new LinkedList();

//监控一个真实对象

List spy = spy(list);

//你可以为某些函数打桩

when(spy.size()).thenReturn(100);

//使用这个将调用真实对象的函数

spy.add("one");

spy.add("two");

//打印"one"

System.out.println(spy.get(0));

//size() 将打印100

System.out.println(spy.size());

//交互验证

verify(spy).add("one");
verify(spy).add("two");

理解监控真实对象非常重要,有时,在监控对象上使用when(Object)来进行打桩是不可能或者不切实际的。因为,当使用监控对象时,请考虑用doReturn、Answer、Throw()函数组来进行打桩,例如:

List list = new LinkedList();

List spy = spy(list);

//这是不可能的: 因为调用spy.get(0)时会调用真实对象的get(0)函数,此时会发生

//IndexOutOfBoundsException异常,因为真实对象是空的 when(spy.get(0)).thenReturn("foo");

//你需要使用 doReturn() 来打桩

doReturn("foo").when(spy).get(0);

Mockito并不会为真实的对象代理函数调用,实际上它会复制真实对象,因此,如果你保留了真实对象并且与之交互,不要期望监控对象得到正确的结果。当你在监控对象上调用一个没有stub函数时,并不会调用真实对象的对应函数,你不会在真实对象上看到任何效果。

1.5 验证被测试类方法

Mock 对象一旦建立便会自动记录自己的交互行为,所以我们可以有选择的对它的 交互行为进行验证。在 Mockito 中验证 Mock 对象交互行为的方法是 verify(mock).someMethod(…)。最后 Assert() 验证返回值是否和预期一样。

1.6 Demo

从网上找来一个最简单的代码实例,下面以具体代码演示如何使用Mockito,代码有三个类,分别如下:

Person类:

public class Person {
private final int id;
private final String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}

PersonDao类:

public interface PersonDao {
Person getPerson(int id);
boolean update(Person person);
}

PersonService类:

public class PersonService {
private final PersonDao personDao;
public PersonService(PersonDao personDao) {
this.personDao = personDao;
}
public boolean update(int id, String name) {
Person person = personDao.getPerson(id);
if (person == null)
{ return false; }
Person personUpdate = new Person(person.getId(), name);
return personDao.update(personUpdate);
}
}

仍然使用Junit自动生成测试类或者手工新建测试类:

单元测试系列:Mock工具之Mockito实战

测试代码生成后,将默认assertfail的删掉,输入以下两个测试方法:

import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*; public class PersonServiceTest { private PersonDao mockDao;
private PersonService personService; @Before
public void setUp() throws Exception {
//模拟PersonDao对象
mockDao = mock(PersonDao.class);
when(mockDao.getPerson(1)).thenReturn(new Person(1, "Person1"));
when(mockDao.update(isA(Person.class))).thenReturn(true); personService = new PersonService(mockDao);
} @Test
public void testUpdate() throws Exception {
boolean result = personService.update(1, "new name");
assertTrue("must true", result);
//验证是否执行过一次getPerson(1)
verify(mockDao, times(1)).getPerson(eq(1));
//验证是否执行过一次update
verify(mockDao, times(1)).update(isA(Person.class));
} @Test
public void testUpdateNotFind() throws Exception {
boolean result = personService.update(2, "new name");
assertFalse("must true", result);
//验证是否执行过一次getPerson(1)
verify(mockDao, times(1)).getPerson(eq(1));
//验证是否执行过一次update
verify(mockDao, never()).update(isA(Person.class));
}
}

注意:我们对PersonDAO进行mock,并且设置stubbing,stubbing设置如下:

  • 当getPerson方法传入1的时候,返回一个Person对象,否则默认返回空
  • 当调update方法的时候,返回true

这里使用了两个参数匹配器:

  isA():Object argument that implements the given class.

  eq():int argument that is equal to the given value

注:Mockito使用verify去校验方法是否被调用,然后使用isA和eq这些内置的参数匹配器可以更加灵活,

关于参数匹配器的详细使用请参考官网文档:https://static.javadoc.io/org.mockito/mockito-core/2.25.0/org/mockito/ArgumentMatchers.html

由于官网的代码和解释非常详细,此处就不再赘述。

仍然调用Junit执行单元测试代码,结果如图所示:

单元测试系列:Mock工具之Mockito实战

验证了两种情况:

  • 更新id为1的Person的名字,预期:能在DAO中找到Person并更新成功
  • 更新id为2的Person的名字,预期:不能在DAO中找到Person,更新失败

这里也可以查看Eclipse抛出的异常信息:

Argument(s) are different! Wanted:

personDao.getPerson(1);

-> at PersonServiceTest.testUpdateNotFind(PersonServiceTest.java:41)

Actual invocation has different arguments:

personDao.getPerson(2);

-> at PersonService.update(PersonService.java:8)

2 单元测试与覆盖率

1、Junit 2、JaCoCo 3、EclEmma

2 覆盖率

覆盖率如下图显示:

单元测试系列:Mock工具之Mockito实战

覆盖率仍然使用JaCoCo和EclEmma:

l  未覆盖代码标记为红色

l  已覆盖代码会标记为绿色

l  部分覆盖的代码标记为黄色

颜色也可以在Eclipse中自定义设置:

单元测试系列:Mock工具之Mockito实战

单元测试系列:Mock工具之Mockito实战

单元测试系列:Mock工具之Mockito实战

在Eclipse下方的状态栏窗口,有一栏“Coverage”,点击可以显示详细的代码覆盖率:单元测试系列:Mock工具之Mockito实战

如何导出为Html格式的Report:

在Eclipse下方的Coverage栏鼠标右键选择“Export Session…”,在弹出窗口中选择export的目标为“Coverage Report”如下图:

单元测试系列:Mock工具之Mockito实战

点击“Next”按钮后,在接下来的弹出窗口选择需要导出的session,Format

类型选择“HTML report”,导出位置暂时选择为桌面,都选择之后点击“Finish”按钮就生成好了。

单元测试系列:Mock工具之Mockito实战

在桌面上找到一个叫做index.html的页面就是刚刚生成好的Coverage Report:

点击文件夹可以进入目录,进一步查看子文件的覆盖率:

单元测试系列:Mock工具之Mockito实战

单元测试系列:Mock工具之Mockito实战

附录:参考文档一览

 Mockito官网: http://site.mockito.org/

5分钟了解Mockito:http://liuzhijun.iteye.com/blog/1512780

Mockito简单介绍及示例:http://blog.csdn.net/huoshuxiao/article/details/6107835

Mockito浅谈:http://www.jianshu.com/p/77db26b4fb54

单元测试利器-Mockito 中文文档:http://blog.csdn.net/bboyfeiyu/article/details/52127551

Mockito使用指南 :http://blog.csdn.net/shensky711/article/details/52771493

JUnit+Mockito 单元测试(二):http://blog.csdn.net/zhangxin09/article/details/42422643

感谢阅读!作者原创技术文章,转载请注明出处

看完点个赞呗,难道想白嫖不成?更多内容请访问微信公众号 :三国测,扫码关注哟!

其他推荐相关阅读:

单元测试系列之一:如何使用JUnit、JaCoCo和EclEmma提高单元测试覆盖率

测试系列之二:Mock工具Jmockit实战

单元测试系列之三:JUnit单元测试规范

单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解

单元测试系列之五:Mock工具之Mockito实战

单元测试系列之六:JUnit5 技术前瞻

单元测试系列之七:Sonar 数据库表关系整理一(rule相关)

单元测试系列之八:Sonar 数据库表关系整理一(续)

单元测试系列之九:Sonar 常用代码规则整理(一)

单元测试系列之十:Sonar 常用代码规则整理(二)

单元测试系列之十一:Jmockit之mock特性详解

单元测试系列:Mock工具之Mockito实战的更多相关文章

  1. 单元测试系列之五:Mock工具之Mockito实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6780719.html 在实际项目中写单 ...

  2. java的mock工具:mockito

    https://site.mockito.org https://github.com/mockito/mockito https://github.com/hehonghui/mockito-doc ...

  3. 单元测试系列之二:Mock工具Jmockit实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6760272.html Mock工具Jm ...

  4. 单元测试系列:Mock工具Jmockit使用介绍

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6760272.html Mock工具Jm ...

  5. 单元测试系列之十一:Jmockit之mock特性详解

    本文是Jmockit学习过程中,根据官网所列的工具特性进行解读. 1.调用次数约束(Invocation count constraints) 可以通过调用计数约束来指定预期和/或允许匹配给定期望的调 ...

  6. 单元测试系列:JUnit单元测试规范

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6762032.html Junit测试代 ...

  7. 单元测试系列:如何使用JUnit&plus;JaCoCo&plus;EclEmma完成单元测试

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢!   原文链接:http://www.cnblogs.com/zishi/p/6726664.html -----如 ...

  8. 单元测试系列之十:Sonar 常用代码规则整理&lpar;二&rpar;

    摘要:帮助公司部署了一套sonar平台,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ======== ...

  9. 单元测试系列之九:Sonar 常用代码规则整理(一)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分 ...

随机推荐

  1. ios 弹出不同的键盘

    iOS 提供了10种键盘类型,在开发中,我们可以根据不同的需求,选择不同的键盘样式,例如,当我们只需要输入手机号码时,可以选择纯数字类型的键盘(NumbersAndPunctuation),当我们需要 ...

  2. mac 下的 top 命令

    mac 下的 top 命令 文章目录 以前只是在 linux 机器上使用 top 命令.常用的快键键是: p 键 - 按 cpu 使用率排序 m 键 - 按内存使用量排序 这 2 个快捷键在 mac ...

  3. 安装centos 6&period;7

    安装centos 6.7 系统 首先系统安装引导,本次系统安装是通过虚拟机安装,与真是环境十分接近 系统引导后第一步是询问是否检测硬盘,选择不检测(Skip) 然后等待系统引导进入安装界面,进入后我们 ...

  4. Axzue注册码

    ahjesus Axure RP 7.0注册码 用户名:axureuser 序列号:8wFfIX7a8hHq6yAy6T8zCz5R0NBKeVxo9IKu+kgKh79FL6IyPD6lK7G6+t ...

  5. Linux学习——粘粘今天看的东西

    由二分割表就叧有64 bytes而已,最多叧能容纳四笔分割的记录, 这四个分割的记录被称为主要(Primary)戒延伸(Extended)分割槽.分割槽的最小单位为磁柱(cylinder)请注意, 延 ...

  6. (六)boost库之内存管理shared&lowbar;ptr

    (六)boost库之内存管理shared_ptr 1.shared_ptr的基本用法 boost::shared_ptr<int> sp(new int(10)); //一个指向整数的sh ...

  7. 转 --maven系列之一 简介

    http://blog.csdn.net/jiuqiyuliang/article/details/41076215 [项目管理和构建]——Maven简介(一) 2015-01-31 21:27 68 ...

  8. 细说 ASP&period;NET Cache 及其高级用法【转】

    阅读目录 开始 Cache的基本用途 Cache的定义 Cache常见用法 Cache类的特点 缓存项的过期时间 缓存项的依赖关系 - 依赖其它缓存项 缓存项的依赖关系 - 文件依赖 缓存项的移除优先 ...

  9. js判断字符串是否在数组中

    先加一个扩展函数: Array.prototype.contains = function (obj) {  var index = this.length;  while (index–) {   ...

  10. Use curl with uuid&lpar;uuidgen&rpar; under shell

    #!set uuidtmp = uuid.tmp #!uuidgen > $uuidtmp #!set uuid=<$uuidtmp #!rm $uuidtmp #!echo $uuid ...