使用EasyMock或Mockito

我大部分时间都在使用EasyMock ,但是最近我和一些非常愿意使用Mockito的人一起工作。

我不打算在同一项目中使用两个框架来实现相同的目的,因此我采用了Mockito 。

因此,在过去的几个月中,我一直在使用Mockito ,这是我对两者的比较分析。

与我一起工作的人列举了使用Mockitio的测试可读性的原因,但是我对此有不同的看法。 假设我们要测试以下代码:
public class MyApp {MyService service;OtherService otherService;void operationOne() {service.operationOne();}void operationTwo(String args) {String operationTwo = otherService.operationTwo(args);otherService.operationThree(operationTwo);}void operationThree() {service.operationOne();otherService.operationThree("success");}
}class MyService {void operationOne() {}
}class OtherService {public String operationTwo(String args) {return args;}public void operationThree(String operationTwo) {}
}

现在,让我使用EasyMock和Mockito为此类编写一个简单的测试用例。

public class MyAppEasyMockTest {MyApp app;MyService service;OtherService otherService;@Beforepublic void initialize() {service = EasyMock.createMock(MyService.class);otherService = EasyMock.createMock(OtherService.class);app = new MyApp();app.service = service;app.otherService = otherService;}@Testpublic void verifySimpleCall() {service.operationOne();EasyMock.replay(service);app.operationOne();EasyMock.verify(service);}}
public class MyAppMockitoTest {MyApp app;MyService service;OtherService otherService;@Beforepublic void initialize() {service = Mockito.mock(MyService.class);otherService = Mockito.mock(OtherService.class);app = new MyApp();app.service = service;app.otherService = otherService;}@Testpublic void verifySimpleCall() {app.operationOne();Mockito.verify(service).operationOne();}}
这是一个非常简单的测试,我必须说Mockito更具可读性。 但是根据经典的测试方法,Mockito测试并不完整。 我们已经验证了我们正在寻找的电话,但是如果明天我通过添加一个服务电话来更改源代码,则测试不会中断。
void operationOne() {service.operationOne();service.someOtherOp();}
现在,这使我感到测试不够好。 但值得庆幸的是,Mockito提供了verifyNoMoreInteractions ,可用来完成测试。 现在,让我为MyApp类编写一些测试。
public class MyAppEasyMockTest {@Testpublic void verifyMultipleCalls() {String args = "one";EasyMock.expect(otherService.operationTwo(args)).andReturn(args);otherService.operationThree(args);EasyMock.replay(otherService);app.operationTwo(args);EasyMock.verify(otherService);}@Test(expected = RuntimeException.class)public void verifyException() {service.operationOne();EasyMock.expectLastCall().andThrow(new RuntimeException());EasyMock.replay(service);app.operationOne();}@Testpublic void captureArguments() {Capture<String> captured = new Capture<String>();service.operationOne();otherService.operationThree(EasyMock.capture(captured));EasyMock.replay(service, otherService);app.operationThree();EasyMock.verify(service, otherService);assertTrue(captured.getValue().contains("success"));}}public class MyAppMockitoTest {@Testpublic void verifyMultipleCalls() {String args = "one";Mockito.when(otherService.operationTwo(args)).thenReturn(args);app.operationTwo(args);Mockito.verify(otherService).operationTwo(args);Mockito.verify(otherService).operationThree(args);Mockito.verifyNoMoreInteractions(otherService);Mockito.verifyZeroInteractions(service);}@Test(expected = RuntimeException.class)public void verifyException() {Mockito.doThrow(new RuntimeException()).when(service).operationOne();app.operationOne();}@Testpublic void captureArguments() {app.operationThree();ArgumentCaptor capturedArgs = ArgumentCaptor.forClass(String.class);Mockito.verify(service).operationOne();Mockito.verify(otherService).operationThree(capturedArgs.capture());assertTrue(capturedArgs.getValue().contains("success"));Mockito.verifyNoMoreInteractions(service, otherService);}
}
这些是一些实际的测试场景,我们想要声明参数,异常等。如果我查看并比较使用EasyMock编写的测试和使用Mockito进行的测试,我倾向于觉得这两个测试在可读性上都是相同的,但它们都没有一个更好的任务。
EasyMock中大量的期望和返回调用使测试不可读,并且Mockito的verify语句通常会影响测试的可读性。 根据Mockito的书verifyZeroInteractions,verifyNoMoreInteractions不应在您编写的每个测试中使用,但是如果我将它们排除在测试范围之外,则我的测试还不够好。
此外,在测试中,所有事情都应在开发人员的控制之下,即交互如何发生以及交互如何发生。 在EasyMock中,这方面更明显,因为开发人员必须在他的代码中放下所有这些交互,但是在Mockito中,框架负责所有交互,而开发人员只关心它们的验证(如果有)。 但是,这可能会导致测试场景,其中开发人员不受所有交互的控制。
Mockito具有像JunitRunner这样的好东西,可用于创建具有所有必需依赖项的Mocks。 这是删除一些基础结构代码的好方法,并且EasyMock也应该有一个。
@RunWith(MockitoJUnitRunner.class)
public class MyAppMockitoTest {MyApp app;@MockMyService service;@MockOtherService otherService;@Beforepublic void initialize() {app = new MyApp();app.service = service;app.otherService = otherService;}
}
结论:
由于我已经使用了这两个框架,因此我认为,除了简单的测试用例之外,EasyMock和Mockito都导致可读性相同的测试用例。 但是EasyMock对于单元测试更好,因为它迫使开发人员控制事物。 由于其假设和考虑,Mockito将这种控制隐藏在地毯下,因此不是一个好选择。 但是Mockito提供了某些非常有用的功能(例如junitRunner,调用链接),而EasyMock的下一个版本中应该有一个。

参考: 到目前为止 ,我们的JCG合作伙伴 Rahul Sharma 使用EasyMock或Mockito在The road…博客博客中。

翻译自: https://www.javacodegeeks.com/2012/08/using-easymock-or-mockito.html

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

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

相关文章

CentOS下iptables 配置详解

如果你的IPTABLES基础知识还不了解,建议先去看看. 开始配置 我们来配置一个filter表的防火墙. (1)查看本机关于IPTABLES的设置情况 [roottp ~]# iptables -L -nChain INPUT (policy ACCEPT)target prot opt source destination Chain FORWARD (policy…

java lambda 多个参数_Java Lambda行为参数化

Java Lambda行为参数化我们可以将lambda表达式作为参数传递给方法。例子以下代码创建了一个名为Calculator的函数接口。在Calculator中有一个称为calculate的方法&#xff0c;它接受两个int参数并返回一个int值。在Main类中有一个引擎方法&#xff0c;它接受函数接口Calculator…

具有关联映射的Hibernate Composite ID

最近&#xff0c;我们面临着带有复合id字段的休眠关联映射的棘手情况。 我们需要与一对一和多对一建立双向关联。我们的拖曳表是“ REPORT”和“ REPORT_SUMMARY”&#xff0c;它们之间具有从REPORT到REPORT_SUMMARY的一对多关系&#xff0c;而从REPORT_SUMMARY到REPORT表。 RE…

ZooKeeper应用场景

ZooKeeper是一个高可用的分布式数据管理与系统协调框架。基于对Paxos算法的实现&#xff0c;使该框架保证了分布式环境中数据的强一致性&#xff0c;也正是基于这样的特性&#xff0c;使得ZooKeeper解决很多分布式问题。网上对ZK的应用场景也有不少介绍&#xff0c;本文将结合作…

java main test_java调用main自动执行testng方法一

主方法import com.com.utlis.createTestngXml;import org.testng.TestNG;import java.util.ArrayList;import java.util.List;/*** author lw* createTime 2019/3/30 15:35* description testng调试类*/public class inittet {private static final String ESCAPE_PROPERTY &q…

有趣的Ruby-学习笔记3

Ruby方法方法名要以小写字母开头。假设用大写字母开头会被作为常量 &#xff08;这点非常奇怪&#xff09;定义一个无參的方法def method_name expr.. end定义一个有參的方法def method_name (var1, var2)expr.. end给參数设定默认值def method_name (var1value1, var2value2)e…

ADF:动态视图对象

今天&#xff0c;我想写有关动态视图对象的文章&#xff0c;它允许我在运行时更改其数据源&#xff08;SQL查询&#xff09;和属性。 我将使用oracle.jbo.ApplicationModule :: createViewObjectFromQueryStmt方法来解决此问题。 我将逐步介绍如何执行此操作 创建视图对象和应…

java stack list_JAVA自己实现List接口Stack

package 集合.Stack;import java.util.Arrays;import java.util.EmptyStackException;import java.util.Vector;public class MyStack {//底层数组默认长度为10private Object[] myStack new Object[10];//sizeprivate int size 0;public MyStack() {}//pushpublic Object pu…

刷题总结——序列操作(权值线段树套树状数组)

题目&#xff1a; 题目描述 给出序列 a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff08;0≤ai≤109&#xff09;&#xff0c;有关序列的两种操作。 1. ai&#xff08;1≤i≤n&#xff09;变成 x&#xff08;0≤x≤109&#xff09;。 2. 求 al&#xff0c;al1&#xff…

原型模式Prototype

原型模式 http://www.cnblogs.com/zhili/p/PrototypePattern.html ICloneable接口 https://msdn.microsoft.com/en-us/library/system.icloneable(vvs.110).aspx Supports cloning, which creates a new instance of a class with the same value as an existing instance. Rem…

I / O神秘化

由于对高度可扩展的服务器设计的所有炒作以及对nodejs的狂热&#xff0c;我一直想重点研究IO设计模式&#xff0c;直到现在为止都没有足够的时间进行投资。 现在已经做了一些研究&#xff0c;我认为最好记下我遇到的东西&#xff0c;作为对我以及可能遇到这篇文章的任何人的未来…

java三大特性 继承_java基础(二)-----java的三大特性之继承

在《Think in java》中有这样一句话&#xff1a;复用代码是Java众多引人注目的功能之一。但要想成为极具革命性的语言&#xff0c;仅仅能够复制代码并对加以改变是不够的&#xff0c;它还必须能够做更多的事情。在这句话中最引人注目的是“复用代码”,尽可能的复用代码使我们程…

Maven本地仓库配置

本地仓库是远程仓库的一个缓冲和子集&#xff0c;当你构建Maven项目的时候&#xff0c;首先会从本地仓库查找资源&#xff0c;如果没有&#xff0c;那么Maven会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不需要从远程下载了。如果你所需要的jar包版本在本地仓库没有…

配置CDI对话的超时

在开发JSF应用程序时&#xff0c;CDI对话范围是一个很好的功能。 假设您有大型数据表&#xff0c;需要花费很长时间才能加载。 由于高内存消耗&#xff0c;您通常不希望将加载的数据放在会话范围的Bean中。 而且&#xff0c;您不能将加载的数据放入视图范围的Bean中&#xff0c…

记录下log4j的两种配置方式

XML文件配置 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4jhttp://jakarta.apache.org/log4j/><!-- 输出到控制台 --><appender na…

java字符串与数组比较大小_java-如何将存储在数组中的字符串与简单字符串进行比较?...

我想比较数组中字符串形式的学生人数与人数n这是字符串。remarque&#xff1a;班级形成&#xff1a;私有字符串代码&#xff1b;私有字符串名称&#xff1b;private int nbsi 0;私人学生[]标签新学生[200]&#xff1b;班级学生&#xff1a;私有字符串号&#xff1b;私有字符串…

delphi用TAdoStoredProc调用存储过程,兼容sql2005、2008、2014的远程事务问题

delphi7写的程序&#xff0c;在sql2000里没问题&#xff0c;调用sql2008、2014里的存储过程时&#xff0c;如果存储过程里操作了大量数据&#xff0c;很容易会莫名其妙的自己撤销掉&#xff0c;但是程序还识别不到&#xff0c;认为还在正常执行。今天尝试换了个控件&#xff1a…

使用NoSQL实现实体服务–第3部分:CouchDB

在本系列的第2部分中 &#xff0c;我使用SOA的“合同优先”技术创建和部署了产品实体服务&#xff0c;现在&#xff0c;我将致力于服务实现的NoSQL数据库方面。 正如我在第1部分中已经提到的那样&#xff0c;我已经选择CouchDB作为我的NoSQL数据库&#xff0c;选择Ektorp库作为…

8、SpringCloud高频面试题-版本1

1、SpringCloud组件有哪些 SpringCloud 是一系列框架的有序集合。它利用 SpringBoot 的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用 SpringBoot 的开发风格做到一键启…

java对象不会被改变_Java 并发编程(二)对象的不变性和安全的公布对象

二、安全公布到眼下为止&#xff0c;我们重点讨论的是怎样确保对象不被公布&#xff0c;比如让对象封闭在线程或还有一个对象的内部。当然&#xff0c;在某些情况下我们希望在多个线程间共享对象&#xff0c;此时必须确保安全地进行共享。然而&#xff0c;假设仅仅是像以下程序…