吸收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…

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

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

[UE4GamePlay架构(九)GameInstance(转)

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

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

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

JSBridge实战

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

单元测试Java Hadoop作业

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

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)&…

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 …

Java 8备忘单中的可选

Java 8 java.util.Optional<T>是scala.Option[T]和Data.Maybe在Haskell中的较差表亲。 但这并不意味着它没有用。 如果您不熟悉此概念&#xff0c;请将Optional想象为可能包含或不包含某些值的容器。 就像Java中的所有引用都可以指向某个对象或为null &#xff0c; Optio…

让 Chrome 崩溃的一行 CSS 代码

一般的 CSS 代码只会出现 UI 版式或者兼容性方面的小问题。但这里我们要分享一行有趣的 CSS&#xff0c;它可以直接让你的 Chrome 页面挂掉 :) 复现 在 Chrome 里打开一个稍复杂的页面&#xff0c;比如知乎或者掘金打开开发者工具&#xff0c;为页面 <body> 增加样式 s…

用Vue Node从零开始实现拼多多前后端商城项目 — 记录踩坑之旅(上篇)

前言 本人移动端开发妹子工程师一枚 &#xff0c;因为公司项目需要用到前端的技术(主要是vue)&#xff0c;自己自学了一段时间&#xff0c;最近花了半个月在工作之余的时间终于自己完完整整写下来一整个前后端商城项目(当然是跟了一个线上项目直播班&#xff0c;不要嘲笑我)&am…

系统重装助手教你如何在Microsoft Edge中恢复“关闭所有选项卡”警告

在Microsoft Edge中&#xff0c;当您打开多个选项卡时&#xff0c;浏览器将显示“您要关闭所有选项卡吗&#xff1f;” 警告&#xff0c;以防止您意外关闭重要标签。 通常&#xff0c;在没有第二个想法的情况下&#xff0c;您会立即禁用此功能&#xff0c;检查提示中的“始终关…

受JAAS保护的JAX-RS端点

随着RESTFUL&#xff08;JAX-RS&#xff09;作为创建Web服务端点的“首选”方式的问世&#xff0c;很长一段时间以来&#xff0c;我一直想知道人们如何围绕它实现安全机制。 归根结底&#xff0c;我假设JAX-RS的基础实现是servlet&#xff0c;因此其安全性也可能围绕容器&…

前端必须懂的计算机网络知识—(跨域、代理、本地存储)

前端必须懂的计算机网络知识系列文章&#xff1a; DNS服务器和跨域问题计算机网络的分层模型IP地址和MAC地址前端必须懂的计算机网络知识—(跨域、代理、本地存储)前端必须懂的计算机网络知识—(TCP)前端必须懂的计算机网络知识—(HTTP)前端必须懂的计算机网络知识—(XSS、CSR…