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和清单文件…

认知无线电matlab代码详解,认知无线电频谱感知之功率检测matlab代码.docx

认知无线电频谱感知之功率检测matlab代码能量检测仿真实验代码:clear all;clc;n 5;ps 1;SNR1 -5;SNR2 -8;SNR3 -10;% Sim_Times10000; %Monter-Carlo times% m5;T0.001;% 信号带宽W W5*10^4;% 采样频率Fs 2*W;m T*W;n 2*T*W;% F0W;% Fs2;% Sigsqrt(2)*sin(2…

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

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

php index.php 文件路径,自研 PHP 框架 1.0_index.php 文件说明

index.php说明在服务上,PHP 引擎其实只执行了 index.php 这一个文件,index.php 可以抽象的看做是产品的最终型态,app 下的文件规定如何组装,system 下的文件提供基本的“组装零件”,最后拼装成一个完整的产品&#xff…

jaas_受JAAS保护的JAX-RS端点

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

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

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

php中return返回数组,PHP中return返回数组的一点用法

本文就学习中遇到的PHP函数return返回值的问题,这一点return用法进行了说明。在函数的内部用return返回一个值或者为空来结束函数的运行。但是在return一个数组的时候,也可以在函数的内部直接使用print_r来打印。但一般都不这么做。拿上一篇文章举例&…

Thread类的有关常用方法

线程优先级问题 start(): 启动线程,并执行对象的run()方法(线程对象.start()) run(): 线程在被调度时执行的操作(线程对象.start()) currentThread(): 返回当前线程,在Thread子类中就是this,通常…

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…

maven 单元测试并行_并行运行单元测试

maven 单元测试并行大约是时候单元测试的开发人员能够使用批注在Parallel中运行测试。 在今天的博客文章中,我们将介绍如何使用Easytest提供的注释使传统的Junit测试并行运行。 易测 是在JUnit之上构建的测试框架,可让您轻松编写和维护测试。 它专注于…

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() [但是可以提供“任意字符串”…

Java多线程(4)--线程的同步解决线程安全问题

多线程出现安全问题 问题的原因: 当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误。 解决办法: 对多条操作共享数据的…