您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Mockito 一个优秀的 Mock 测试框架

时间:2021-06-09 13:22:17  来源:今日头条  作者:IT圈的孙红雷

原文链接:https://mp.weixin.qq.com/s/rQRO2SaqhQImQlnA5NsEQw

原作者:JAVA极客技术

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

Mockito 一个优秀的 Mock 测试框架

 

我们通过使用 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 文件里面加依赖,我们加上 mockito 和junit 的依赖。

<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();
}

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

Mockito 一个优秀的 Mock 测试框架

 

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

Mockito 一个优秀的 Mock 测试框架

 

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

 //精确次数
 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);
}
Mockito 一个优秀的 Mock 测试框架

 

可以看到当我们调用 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() 方法进行抛异常:

Mockito 一个优秀的 Mock 测试框架

 

测试用例 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,有更详细的介绍。

Mockito 一个优秀的 Mock 测试框架

 



Tags:Mockito   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Hello 大家好,我是阿粉,日常工作中很多时候我们都需要同事间的相互配合协作完成某些功能,所以我们经常会遇到服务或者应用内不同模块之间要互相依赖的场景。比如下面的场景,...【详细内容】
2021-06-09  Tags: Mockito  点击:(127)  评论:(0)  加入收藏
为什么要mock?有很多朋友不愿意写单元测试,觉得写单测试比较花时间,甚至不会写单元测试,很大程度上是因为不想写或者不会写mock。mock对于单元测试来很重要。单元测试之所以名...【详细内容】
2020-08-17  Tags: Mockito  点击:(114)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条