Mockito 一个优秀的 Mock 测试框架

简介: Hello 大家好,我是阿粉,日常工作中很多时候我们都需要同事间的相互配合协作完成某些功能,所以我们经常会遇到服务或者应用内不同模块之间要互相依赖的场景。比如下面的场景,serviceA 中的 methodA() 方式依赖 serviceB 中的 methodB() 方法返回操作的结果。那如果我们要对自己的methodA() 方法进行编写单元测试,还需要等其他同事的methodB() 方法开发完成才行。那有没有什么办法我们可以跳过或者说模拟方法 B 的输出呢?这就引出了我们今天的主角 Mockito,一个优秀的 Mock 测试框架。

Hello 大家好,我是阿粉,日常工作中很多时候我们都需要同事间的相互配合协作完成某些功能,所以我们经常会遇到服务或者应用内不同模块之间要互相依赖的场景。比如下面的场景,serviceA 中的 methodA() 方式依赖 serviceB 中的 methodB() 方法返回操作的结果。那如果我们要对自己的methodA() 方法进行编写单元测试,还需要等其他同事的methodB() 方法开发完成才行。那有没有什么办法我们可以跳过或者说模拟方法 B 的输出呢?这就引出了我们今天的主角 Mockito,一个优秀的 Mock 测试框架。

16.jpg

我们通过使用 Mock 技术可以让开发不停滞,Mock技术的作用是将服务与服务之间的依赖在测试自测阶段隔离开,让开发人员在自己的应用内部通过模拟的方式把需要依赖外部的接口给构造出来,从而保证不被外界的开发进度所影响。今天我们要谈到的Mockito 就是一个优秀的 Mock 框架。

Mockito

Mockito is a mocking framework that tastes really good. It lets you write beautiful tests with a clean & simple API. Mockito doesn’t give you hangover because the tests are very readable and they produce clean verification errors.

Mockito 是一个很好用的模拟框架。它让您可以使用干净简单的 API 编写漂亮的测试。Mockito 的可读性非常好,不会让你感动迷惑,产生的验证错误也很明确。

官网地址:https://site.mockito.org/

中文文档:https://github.com/hehonghui/mockito-doc-zh#0

测试用例 1

首先在工程的 pom 文件里面加依赖,我们加上 mockitojunit 的依赖。

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-all</artifactId>
  <version>1.9.5</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>

接下来我们编写一个简单的测试用例,这里我们通过mock 一个 List 对象,先添加几个元素,后面验证添加交互是否与我们预期的一致。

@Test
public void testVerify() throws Exception {
  //创建 mock 对象
  List mockedList = mock(List.class);
  mockedList.add("test1");
  mockedList.add("test2");
  mockedList.add("test2");
  mockedList.clear();
  //验证是否执行了一次 add("test1") 操作
  verify(mockedList).add("test1");
  //同上面验证是否执行了一次 add("test1") 操作,默认就是 time(1)
  verify(mockedList, times(1)).add("test1");
  //验证是否执行了3次 add("test2") 操作
  //verify(mockedList, times(3)).add("test2");
  verify(mockedList).clear();
}

上面的测试用例我们运行过后是如下效果,测试用例是通过的。

17.jpg

当我们放开verify(mockedList, times(3)).add("test2"); 这一行代码进行运行时,我们可以看到测试用例未通过,提示的错误是我们预期执行 3 次,结果实际只执行了 2 次add("test2") 操作。

18.jpg

上面的测试用例是验证对应方式的执行次数是否和预期一致,除了有准确的次数之外,还有最多,至少,从未等验证方式,如下所示:

 //精确次数
 verify(mockedList, times(3)).add("test2");
 //至少 1次
 verify(mockedList, atLeastOnce()).add("test2");
 //至少 2 次
 verify(mockedList, atLeast(2)).add("test2");
 //最多 5 次
 verify(mockedList, atMost(5)).add("test2");

测试用例 2

通过设值或者打桩的方式预设参数,如下所示,当执行 get(0) 操作时,我们通过 thenReturn()方法返回 hello,当执行 get(1)操作时我们抛出空指针异常,运行结果如下图所示:

@Test
public void testWhen() throws Exception {
  LinkedList mockedList = mock(LinkedList.class);
  //设置值,通常被称为打桩
  when(mockedList.get(0)).thenReturn("hello");
  when(mockedList.get(1)).thenThrow(new NullPointerException());
  System.out.println(mockedList.get(0));
  //这里会打印 "null" 因为 get(2) 没有设置
  System.out.println(mockedList.get(2));
  //这里会抛 exception
  System.out.println(mockedList.get(1));
  //验证有没有执行 get(0) 操作
  verify(mockedList).get(0);
}

19.jpg

可以看到当我们调用 get(0)get(1) 的时候控制台成功的抛出了异常。这种方式通常被称为Stubbing,除了使用 when...thenReturn 方式之外,还有一种形式可以表达,代码如下:

@Test
public void testDoReturn() throws Exception {
  Iterator mockedList = mock(Iterator.class);
  doReturn("hello").when(mockedList).next();
  Object next = mockedList.next();
  System.out.println(next);
  doReturn("world").when(mockedList).next();
  Object next2 = mockedList.next();
  System.out.println(next2);
  //上面的过程也可以写成如下方式
  doReturn("test1", "test2").when(mockedList).next();
  Object next3 = mockedList.next();
  System.out.println(next3);
  Object next4 = mockedList.next();
  System.out.println(next4);
}

运行结果如下所示,也可以用 doThrow() 方法进行抛异常:

20.jpg

测试用例 3

日常开发中我们通过要保证方法的时效性,或者说我们要保证我们某个方法必须在多长时间内执行完成,这个时候我们也可以通过 mock 的方式来验证我们的方法是否满足要求。代码如下:

@Test
public void testTimeout() throws Exception {
      HttpService mock = mock(HttpService.class);
      String url = "http://www.xxx.com";
      mock.getRequest(url);
      verify(mock, timeout(100)).getRequest(url);
      //timeout时间后,用自定义的检验模式验证getRequest()
      VerificationMode customVer = new VerificationMode() {
        @Override
        public void verify(VerificationData data) {
        }
        @Override
        public VerificationMode description(String s) {
          return null;
        }
      };
      verify(mock, new Timeout(100, customVer)).getRequest(url);
}

Mockito 还有很多 API 可以使用,更多的使用方式,大家可以参考这面这个网站。https://www.tutorialspoint.com/mockito/mockito_timeouts.htm,有更详细的介绍。

21.jpg


相关文章
|
8天前
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
48 8
|
14天前
|
人工智能 JavaScript 前端开发
自动化测试框架的演进与实践###
本文深入探讨了自动化测试框架从诞生至今的发展历程,重点分析了当前主流框架的优势与局限性,并结合实际案例,阐述了如何根据项目需求选择合适的自动化测试策略。文章还展望了未来自动化测试领域的技术趋势,为读者提供了宝贵的实践经验和前瞻性思考。 ###
|
3天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
25 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
9天前
|
安全 Ubuntu Linux
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
31 9
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
|
13天前
|
Java 测试技术 API
探索软件测试中的自动化测试框架
本文深入探讨了自动化测试在软件开发中的重要性,并详细介绍了几种流行的自动化测试框架。通过比较它们的优缺点和适用场景,旨在为读者提供选择合适自动化测试工具的参考依据。
|
16天前
|
jenkins 测试技术 持续交付
自动化测试框架的搭建与实践
在软件开发领域,自动化测试是提升开发效率、确保软件质量的关键手段。本文将引导读者理解自动化测试的重要性,并介绍如何搭建一个基本的自动化测试框架。通过具体示例和步骤,我们将探索如何有效实施自动化测试策略,以实现软件开发流程的优化。
41 7
|
13天前
|
数据管理 jenkins 测试技术
自动化测试框架的设计与实现
在软件开发周期中,测试是确保产品质量的关键步骤。本文通过介绍自动化测试框架的设计原则、组件构成以及实现方法,旨在指导读者构建高效、可靠的自动化测试系统。文章不仅探讨了自动化测试的必要性和优势,还详细描述了框架搭建的具体步骤,包括工具选择、脚本开发、执行策略及结果分析等。此外,文章还强调了持续集成环境下自动化测试的重要性,并提供了实际案例分析,以帮助读者更好地理解和应用自动化测试框架。
|
14天前
|
监控 测试技术 定位技术
探索软件测试中的自动化测试框架选择与实施###
本文不概述传统意义上的摘要内容,而是直接以一段对话形式引入,旨在激发读者兴趣。想象一下,你是一名勇敢的探险家,面前摆满了各式各样的自动化测试工具地图,每张地图都指向未知的宝藏——高效、精准的软件测试领域。我们将一起踏上这段旅程,探讨如何根据项目特性选择合适的自动化测试框架,并分享实施过程中的关键步骤与避坑指南。 ###
27 4
|
13天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
14天前
|
测试技术 持续交付 数据安全/隐私保护
软件测试的艺术与科学:探索自动化测试框架
在软件开发的世界中,测试是确保产品质量的关键环节。本文将深入探讨自动化测试框架的重要性和实现方法,旨在为读者揭示如何通过自动化测试提升软件测试效率和准确性。我们将从测试的基本概念出发,逐步引导读者了解自动化测试框架的设计和实施过程,以及如何选择合适的工具来支持测试活动。文章不仅提供理论知识,还将分享实用的代码示例,帮助读者将理论应用于实践。无论你是测试新手还是经验丰富的开发者,这篇文章都将为你打开一扇通往更高效、更可靠软件测试的大门。
18 1