mockito_吸收Mockito的流利度

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是否被调用,以及是否传入了三个特定的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

mockito

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

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

相关文章

Java异常处理(1)--异常概述与异常体系结构

在Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常) Java程序在执行过程中所发生的异常事件可分为两类: ①Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等…

Payara Micro在Oracle应用容器云上

在此博客文章中,我将介绍如何将打包在Payara Microber -jar中的CloudEE Duke应用程序部署到Oracle Application Container Cloud 。 在Oracle Application Container Cloud中进行部署所需的部署工件是一个ZIP归档文件,其中包含应用程序ber-jar和清单文件…

Java异常处理(2)--异常处理机制及自定义异常

在编写程序时,经常要在可能出现错误的地方加上检测的代码,如进行x/y运算时,要检测分母为0,数据为空,输入的不是数据而是字符等。过多的if-else分支会导致程序的代码加长、臃肿,可读性差。因此采用异常处理机…

jaas_受JAAS保护的JAX-RS端点

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

Java多线程(1)--基本概念:程序、进程、线程

程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 进程(process)是程序的一次执行过程,或是正在运行的一个程序,是一个动态的过程:有它自身的产生、存在和消亡的过程。——生命周…

Java中的Volatile如何工作? Java中的volatile关键字示例

如何在Java中使用Volatile关键字 在Java采访中,什么是volatile变量以及何时在Java中使用volatile变量是Java 采访中一个著名的多线程采访问题 。 尽管许多程序员都知道什么是volatile变量,但是他们在第二部分上失败了,即在Java中何处使用vol…

Java线程的调度及线程的优先级

调度策略 Java的调度方法 同优先级线程组成先进先出队列(先到先服务),使用时间片策略。 对高优先级,使用优先调度的抢占式策略。 线程的优先级等级 Thread.MAX_PRIORITY:10 Thread.MIN _PRIORITY:1 Threa…

Spring Boot 2应用程序和OAuth 2 –传统方法

这篇文章是3个系列文章中的第二部分,探讨了如何为基于Spring Boot 2的应用程序启用OSO2提供程序SSO。 3个帖子是: 1. 引导兼容OpenID Connect的OAuth2授权服务器/ OpenID提供程序的方法 2.与OAuth2授权服务器/ OpenID提供程序集成的旧版Spring Boot / …

Java多线程(2)--Thread类继承和Runnable接口创建线程

Java语言的JVM允许程序运行多个线程,它通过java.lang.Thread类来体现。 Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体,通过该Thread对象的start()方法来启动这个线程&#x…

matlab在电磁场与电磁波中的应用,matlab在电磁场与电磁波学习中的应用.docx

matlab在电磁场与电磁波学习中的应用.docx MATLAB在电磁场与电磁波学习中的应用裴逸菲(燕京理工学院信息科学与技术学院,河北廊坊065201)摘要针对电磁场与电磁波在大学课程中的理论性强、概念抽象的特点,在学习中引入MATLAB软件,利用MATLAB的…

Java多线程(3)--线程的生命周期

JDK中用Thread.State类定义了线程的五种状态 要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的五种状态: ①新建: 当一个Thread类或…

m序列自相关matlab代码,m序列的输出及其自相关序列

【例10-2】 设m序列的生成多项式为g(x)1x^3x^4,求:(1)m序列的输出及其自相关序列;(2)脉冲波形成为矩形脉冲p(t){1 0≤t≤Tc 画出m序列信号的自相关函数;{0 其它 ,(3)设脉冲波形为升余弦函数(滚降系数a0),画…

JDK 10:从Java访问Java应用程序的进程ID

StackOverflow.com上一个普遍的问题是:“ Java程序如何获得自己的进程ID? 与该问题相关的几个答案包括解析ManagementFactory返回的String 。 getRuntimeMXBean() 。 getName() [但是可以提供“任意字符串”…

spring常见面试问题_Spring面试问题

spring常见面试问题另外,请查看我们最新的文章69Spring面试问题与解答–最终清单 。 1)什么是春天? 回答: Spring是控件和面向方面的容器框架的轻量级反转。 2)解释春天? 回答: 轻巧&#x…

matlab谱系聚类图,如何看懂SPSS聚类分析的树状图/谱系图?

原创: 数据小兵 SPSS统计训练营SPSS聚类分析提供两种类别图形的输出,第一种是软件默认的“冰柱图”,形状类似于冬天屋檐上垂下的冰柱,因此得名。第二种是“树状图”,在新版本软件中也称谱系图,像一个横着生…

Java常用类(1)--字符串相关类String、StringBuffer、StringBuilder全面知识

文章目录String类StringBuffer类StringBuilder类String:不可变的字符序列;底层使用char[]存储 StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储 StringBuilder:可变的字符序…

hybbs接口php,HYBBS

#HYBBS官方地址: http://bbs.hyyyp.com论坛基于HYPHP框架开发MVC结构支持HOOK机制PDO操作SQL,支持众多数据库论坛特性服务器环境要求:支持子目录安装论坛PHP 5.3 包括5.3 , 5.3以上环境Apache || Nginx || IIS需要开启伪静态,否则无法安装~!数据库支持 : MYSQL , MSSQL ,Oracle…

Java常用类(2)--日期时间相关类Date、Calendar、LocalDateTime、Instant全面

文章目录java.lang.System类java.util.Date类java.sql.Date类java.text.SimpleDateFormat类java.util.Calendar(日历)类java.time类java.time.Instant类java.time.format.DateTimeFormatter 类其它APIjava.lang.System类 System类提供的public static long currentTimeMillis(…

apache camel_Apache Camel简介

apache camelApache Camel是著名的企业集成模式的开源实现。 Camel是一个路由和中介引擎,可帮助开发人员以各种特定于域的语言(DSL)(例如Java,Spring / XML,scala等)创建路由和中介规则。 骆驼…

Angular5 JWT身份验证(Spring Boot安全性)

欢迎使用带有Spring Security的angular5 jwt身份验证。在本教程中,我们将在一个angular5单页应用程序中使用jwt身份验证创建一个完整的堆栈应用程序,该应用程序具有由spring boot支持并集成了spring security的后备服务器。带有集成了HttpInterceptor的示…