吸收Mockito的流利度

我最近发现自己编写了一些代码来集成两个不同的平台。 这些系统之一是基于Java的系统,而另一个虽然不是用Java编写的,却提供了Java API。 我将这些系统分别称为Foo和Bar。 莫基托

在编写一行代码之前就很明显了,但是,测试最终的适配器将需要我显式地模拟后来的系统的API(即Foo),因为我所需要的只是一个jar文件,其类和方法清楚了他们与一个实例进行了交流。

我花了几个周期看一下Java 模拟世界中的新功能,我很高兴看到我的老朋友Mockito仍然很活跃,并且实际上仍然是通用模拟的出色工具 。 对于初学者来说, Mockito是基于Java的模拟框架,它可以:

…味道真的很好。 它使您可以使用[a]简洁的API编写漂亮的测试。 Mockito不会给您带来麻烦,因为这些测试可读性强,并且会产生清晰的验证错误。

Google代码模拟项目页面 –为什么喝呢?

实际上,Mockito提供了一个简单,流畅的API ,使您可以精确地模拟行为而不必大惊小怪。 例如,与Bar进行交互的主要外观是通过QTP类,该类具有诸如logInlogOut等方法。与其依靠被测类实际调用这些方法,我还可以像这样轻松地使用Mockito创建QTP模拟实例。 :

模拟QTP实例

QTP qtpThing = mock(QTP.class);

其中, mock是从org.mockito.Mockito静态导入的方法。 使用模拟实例,然后我可以指示我希望某些方法如何运行, 只要我将此模拟实例传递给我的被测类即可

例如,方法logIn不返回任何内容。 实际上,必须先调用该方法,然后再调用另一个方法以生成票证(或令牌),该票证将在后续方法调用中使用。 因此,我正在编写的适配器将接收一些输入值(从Foo以XML的形式),并且适配器将返回票证(按照Foo所需的XML模式以XML文档的形式)。

因此,测试这种交互,我需要做两件事:

  • 确保使用特定参数调用logIn方法
  • 通过getTicket方法模拟有效票证的响应

而且,我还要验证logIn失败是否导致适配器代码中发生特定的交互。 因此,我还需要模拟一些异常行为。

在模拟特定方法的情况下,您只需将几个方法链接在一起即可。 在我的情况下, when and thenReturn可以像这样进行操作:

模拟getTicket的行为

when(qtpThing.getTicket()).thenReturn("test-ticket");

在上面的代码中,在我的模拟实例上调用getTicket方法时,将返回String “ test-ticket”。

接下来,为了确保使用从传入XML文档获得的参数调用logIn ,我可以使用Mockito的verify方法。

使用Mockito的验证来确保正确的交互

verify(qtpThing, times(1)).logIn("some_value", "some_user_name", "password");

在这种情况下, verify方法将检查logIn调用logIn并传入三个特定的String值。如果不满足这些期望,则Mockito将引发异常(并且您相应的测试用例将失败)。

因此,用于验证适配器的测试用例非常简单,但可读性很高。

用于验证登录行为的JUnit测试用例

@Test
public void testLoginRequest() throws Exception {QTP qtpThing = mock(QTP.class);when(qtpThing.getTicket()).thenReturn("test-ticket");AdapterRequest request = new AdapterRequest(XML.read("etc/test-login-req.xml"));QbosAdapter adapter = new QbosAdapter();adapter.setQtpInstance(qtpThing);AdapterResponse adapterResponse = adapter.performAction(request);assertNotNull(adapterResponse);verify(qtpThing, times(1)).logIn("some_value", "some_user_name", "password");assertEquals("test-ticket", adapterResponse.getData().getText());
}

如果我需要模拟QTP对象抛出的异常,表面QTP是由于无效参数或登录时凭据不正确怎么办? 同样,Mockito的流畅API使这一切变得轻而易举。

就我而言,我希望logIn方法在其方法签名中抛出一个已检查的方法,该方法名为UnknownQtpException 。 您可以通过doThrowwhen方法执行此操作。

模拟出Mockito中的异常

doThrow(new UnknownQtpException()).when(qtpThing).logIn("", "blah", "blah");

在上面的代码中,我明确声明,如果logIn命令的第一个参数为空,则UnknownQtpException QTP实例应抛出UnknownQtpException 。 将所有内容放在一起将产生以下测试用例:

使用JUnit和Mockito测试异常情况

@Test
public void testFailureLoginRequest() throws Exception {QTP qtpThing = mock(QTP.class);doThrow(new UnknownQtpException()).when(qtpThing).logIn("", "blah", "blah");XML xml = XML.read("etc/test-login-req-err.xml");AdapterRequest request = new AdapterRequest(xml);QbosAdapter adapter = new QbosAdapter();adapter.setQtpInstance(qtpThing);AdapterResponse adapterResponse = adapter.performAction(request);assertNotNull(adapterResponse);verify(qtpThing, times(1)).logIn("", "blah", "blah");assertEquals("FAILURE", adapterResponse.getData().getText());
}

当然,其优点在于,我的测试用例可以有效地测试我的适配器代码,而无需依赖第三方系统(在本例中为Bar)。 这自然是一种久经考验的测试技术,可在任何语言中使用,值得一试的模拟框架!

如果您发现自己用Java编写了一些集成代码,那么我不推荐Mockito。 Mockito的API非常简单,它使测试易于理解。 我的意思是,它使测试易于吸收。 数字?

参考: The Disco Blog博客中的JCG合作伙伴 Andrew Glover 吸取了Mockito的流畅性 。

翻译自: https://www.javacodegeeks.com/2013/08/imbibing-the-fluency-of-mockito.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程第三次作业

题目要求 最大连续子数组和(最大子段和) 问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]a[i1]…a[j]的子段和的最大值。 当所给的整数均为负数时定义子段和为0,依此定义&a…

使用HTML5 IndexDB存储图像和文件

使用IndexedDB存储图像和文件 有一天,我们写了关于如何在localStorage中保存图像和文件的文章,它是关于我们今天可用的实用主义。 然而,localStorage有一些性能影响 - 我们将在稍后的博客中讨论这个问题 - 并且未来期望的方法是使用IndexedD…

Gitlab 项目上传

一,登陆gitab,新建reject Repository name: 仓库名称 Description(可选): 仓库描述介绍 Public, Private : 仓库权限(公开共享,私有或指定合作者) Initialize this repository with a README: 添加一个README.md gitig…

Java Servlet的前100个问题

1)是“ servlets”目录还是“ servlet”目录? 回答: 对于Java Web Server: 在文件系统上,它是“ servlet” c:\ JavaWebServer1.1 \ servlets \ DateServlet.class 在URL路径中,它是“ servl…

stm32f103r6最小系统原理图_超强PCB布线设计经验谈附原理图

在当今激烈竞争的电池供电市场中,由于成本指标限制,设计人员常常使用双面板。尽管多层板(4层、6层及8层)方案在尺寸、噪声和性能方面具有明显 优势,成本压力却促使工程师们重新考虑其布线策略,采用双面板。在本文中,我…

[UE4GamePlay架构(九)GameInstance(转)

GameInstance这个类可以跨关卡存在,它不会因为切换关卡或者切换游戏模式而被销毁。然而,GameMode和PlayController就会再切换关卡或者游戏模式时被引擎销毁重置,这样他们里面的状态就不能被保存。比如,你想再下一个关卡中知道上一…

php+原生代码+赋值,js重新赋值原生的方法

js的原生方法被覆盖掉以后,如果你还没让原生方法又从新指向一个新的变量名,那就gg了。所以,关键就是怎么再获取到原生的方法。实现的原理呢就是创建一个新的window对象,然后从新的window对象里面获取原生的方法,来重新…

python基础知识 - Day4

String相关的方法: 1. 字符串格式化 format "hello, %s. %s enough for you" values (cloris,hot) print (format % values) 2. 字符串方法 - find() 可以在一个较长的字符串中查找子字符串。返回子串所在位置的最左端索引。如果没有找到,返回…

灵格斯怎么屏幕取词_电脑包尺寸怎么选?手提的好还是双肩的好?比较推荐哪款电脑包?...

在携带笔记本电脑的时候,一般都会用到电脑包,那么电脑包的尺寸该怎么选呢?为了能更好的装下电脑,电脑包的尺寸必须要比笔记本电脑的尺寸大一些,而不能刚刚好。笔记本的尺寸参数一般是指屏幕尺寸,而整个机身…

JSBridge实战

前言 H5 VS Native 一直是前端技术界争执不下的话题。react、vue等技术栈引领着纯H5开发,rn、week则倡导原生体验。但在项目实战中,经常会选择一个中立的方案:混合开发。大众称呼:Hybrid。 本人目前从事新闻类产品研发&#xff…

单元测试Java Hadoop作业

在我以前的文章中,我展示了如何设置一个完整的基于Maven的项目,以用Java创建Hadoop作业。 当然并没有完成,因为它缺少单元测试部分。 在本文中,我将展示如何将MapReduce单元测试添加到我之前开始的项目中。 对于单元测试&#xff…

【bzoj4008 hnoi2015】 亚瑟王

题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑。他决定,在脱坑之前,最后再来打一盘亚瑟王。既然是最后一战,就一定要打得漂亮。众所周知,亚瑟王是一个看脸的游戏,技能的发…

python 编码声明位置,python中的编码声明

python中的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它,就这么简单#!/usr/bin/python 相当于写死了 python 路径(是告诉OS执行这个py时,调用 /usr/bin 下的 python 解释器;)#!/usr/bin/e…

vue2.0中的:is和is的区别

此文首发于 https://lijing0906.github.io/ 最近,工作之余在翻阅vue.js的官方文档,在查看到动态组件和解析 DOM 模板时的注意事项的时候,讲到一个特殊的is特性,觉得很有意思,就来写一篇自己理解的总结。 现场 写栗子…

mysql复制模式第二部分-----双主模式

双主配置 我在配置主从服务器时,使用了两台服务器:10.19.34.126和10.19.34.91。 1、首先需要在这两台上搭建单独的mysql服务masterA和masterB。 2、配置数据库masterA,要对每一个数据库服务配置唯一标示,参数名为server-id&#x…

pde中微元分析法的主要思想_初中数学常用的思想方法丨所有题型的考试技巧最全整理,高分必备...

【导语】初中数学虽然是基础数学,但是这并不意味着就没有难度,特别是在素质教育下,从培养学生综合素质能力的角度出发,初中数学越来越重视数学思维的培养,因此在很多数学问题的设置上,都进行了相当难度的调…

解决IntelliJ IDEA控制台乱码问题[包含程序运行时的log4j日志以及tomcat日志乱码]...

一、控制台打印的程序运行时的log4j日志中包含中文乱码 在IDEA安装目录的bin目录下找到名为"idea.exe.vmoptions"的文件: 使用文本编译软件(Notepad等)打开此文件,在文件内容从末尾追加一行设置(-Dfile.encodingUTF-8)&…

如何在Spring 3.x中使用事件

创建松耦合应用程序的概念和技术很多,Event是其中之一。 事件可以消除代码中的许多依赖关系。 有时没有事件,很难实施SRP *。 Java中的Observable接口可以帮助我们实现事件(通过Observer Pattern)。 但是,等等&#x…

php识别地址,实现地址自动识别实例(PHP)

具体问题具体分析!代码实现基于laravel完成。一个laravel完整的功能得具备这些:路由route,Model, View, Controller, 我这里用的有依赖注入服务容器等功能,当然,用到地址,你首先要有地址库。。。下面来看看…

kubernetes cpu限制参数说明

docker CPU限制参数 Option Description --cpus<value> Specify how much of the available CPU resources a container can use. For instance, if the host machine has two CPUs and you set --cpus"1.5", the container is guaranteed at most one and …