mockito_书评:Mockito Essentials

mockito

Sujoy Acharya的Mockito Essentials副标题( Packt出版 ,2014年10月)是:“实用指南,可帮助您使用Mockito进行单元测试并开始运行。” Mockito Essentials中的前言和七章涵盖大约190个实质性页面。

MockitoEssentialsCover

前言

在序言中,作者Sujoy Acharya写道Mockito Essentials “是一个高级指南,将帮助软件开发人员使用Mockito作为模拟框架来获得有关单元测试的完整专业知识。” 前言包含本书七章中每一章的简短摘要(通常为两三个句子)。

序言部分“本书所需的内容”列出了运行Mockito Essentials中提供的示例所需的软件,并提供了本书中所用版本的链接(在撰写本文时,其中某些版本被称为“最新”)。 这些产品包括Mockito , JDK 7或更高版本以及Eclipse ( Luna 4.4.1 )。 我要补充一点,对于大多数/所有示例,还需要JUnit ,对于某些示例,还需要PowerMock,对于某些示例,还需要Java EE servlet JAR。

我在这里引用了Mockito Essentials的序言中的“这本书是谁的”整个部分,因为这可以很好地理解读者的期望以及本书的撰写对象:


本书适用于在JUnit框架中使用Mockito的高级到新手级软件测试人员/开发人员,他们具有合理的知识水平并且对单元测试元素和应用程序有理解。 对于具有Java应用程序开发经验和JUnit测试基础知识的开发人员来说,它是理想的选择,但是它涵盖了JUnit测试和Mockito框架的基本基础,以使您在使用它们之前熟悉这些概念。

Mockito Essentials的序言还指出,可以下载PDF格式的彩色书籍。 我从提供的链接下载了此PDF,并确认大多数图像都是彩色的。 我也很高兴看到我审阅的书的PDF版本已经将这些图形显示为彩色。 但是,对于那些拥有印刷版图书的人来说,这个带有彩色图形的单独PDF可能会有帮助。

第1章:探索测试双打

Mockito Essential的初始章节在很大程度上没有专门介绍Mockito,而是在Mockito实现常规单元测试实践和概念时进行了引用 。 相反,第一章概述了单元测试。 本章首先探讨了为什么单元测试很有价值,并确定了有效单元测试通常具有的特征。 这部分简短的内容对于单元测试的新手很有用,但对于那些熟悉单元测试概念的人可能会被跳过。

第一章的下一个主要部分是“理解测试的两倍”,它比第一部分的单元测试优势和有效的单元测试特性要长得多。 第二部分提供了本章中描述的测试双精度 类型 ( XUnit测试模式中 创造的术语)的代码清单和文本说明: 虚拟对象 , 存根 , 间谍 , 模拟对象和伪对象 。

第2章:与Mockito进行社交

因为Mockito Essentials的第一章是关于通用单元测试的,所以第二章是本书的第一章,重点介绍Mockito。 本章首先提供指向Mockito 主页和github 上 Wiki的链接,并描述Mockito及其开放源代码( MIT )许可证。

第2章“探索单元测试质量”部分介绍了单元测试中的“可读性,灵活性和可维护性原则”。 其中一些内容重复了第一章的想法,但这是快速的部分。 “实现Mockito的重要性”部分讨论了Mockito如何通过嘲笑那些东西来解决“测试不友好的行为”和“与测试不友好的外部对象”的交互,因此单元测试不必受到它们的阻碍。

第2章的“使用Mockito”部分首先显示Mockito徽标(PDF版本为彩色),然后深入介绍使用Mockito的特定基础知识。 本节介绍下载 Mockito并将其配置为Eclipse, Maven和Gradle中的依赖项。 “存根方法调用”小节提供了一个测试应用程序示例,该应用程序由jQuery客户端组成,该jQuery客户端与似乎基于Spring Web MVC的后端进行通信。 然后,该示例演示了如何使用Mockito来模拟和存根要测试的后端类所使用的类。 代码演示了如何使用Mockito.mock(Class)或使用静态导入,以便可以将其简单地称为mock(Class) 。 本节还介绍了@Mock批注的用法。

第2章介绍了Mockito的“ 触发器 ”方法when(T)以及关联的“触发动作”方法thenReturn(-) , thenThrow(-) , thenAnswer(-)和thenCallRealMethod(-) 。 第2章提供了一个示例,该示例使用带有JUnit 4的@Test(expected =””) 注释的单元测试方法以及Mockito的thenThrow方法。

Mockito Essentials的第二章说明并解释了Mockito的参数匹配器,并参考了org.mockito.Matchers文档 。 然后,它将ArgumentMatcher引入为“具有预定义的describeTo()方法的Hamcrest匹配器”,它“允许我们创建自己的自定义参数匹配器。” 然后,本章描述并说明了JUnit 4与某些常见的Hamcrest匹配器(例如equalTo , is , anyOf和allOf 两者 都不 是)的 用法 。

第2章中的“验证方法调用”一节讨论了使用Mockito的静态方法验证来“验证”模拟对象上的方法,并描述了可能需要的情况。

第2章的最后一节(“了解Mockito架构”)对我来说可能是最(令人愉快的)惊喜之一。 我喜欢作者使用序列图来说明Mockito如何使用CGLib (字节码生成库)来“ [应用]代理设计模式来创建模拟对象”。 我也喜欢作者提供的解释和代码清单,以演示如何使用Java反射和动态代理 “创建自定义模拟框架来处理外部依赖关系”。 大多数尝试学习Mockito基础知识的读者可能不需要这些知识,但我认为更深入地了解本节提供的工具会有所帮助。

第三章:加速Mockito

Mockito Essentials的第三章旨在涵盖更高级的Mockito主题,并从解决单元测试void方法 (包括从void方法和void方法回调引发异常)的著名问题开始。 本章的这一部分还将介绍doNothing() , doReturn() , ArgumentCaptor和InOrder 。

第3章介绍了“监视对象”部分,其中指出:“ Mockito间谍允许我们通过将某些方法替换为存根控件来使用真实对象而不是模拟对象。 这种行为使我们能够测试遗留代码。” 文本和代码清单演示了Mockito的间谍工具的使用,并且在与Mockito Spy一起使用时警告使用doReturn()而不是thenReturn() 。

第3章的“探索Mockito注释”一节介绍了三个Mockito注释 ( @Captor , @Spy和@InjectMocks )。 “更改默认的Mockito设置”部分介绍了使用Answers枚举的五个可用值配置“模拟对象的非桩方法”返回的默认值。

第3章介绍了Mockito.reset(T…),并提供了与该方法的Javadoc文档中类似的用法警告。 第3章的一小节将介绍内联存根 。 另一小节介绍了使用Mockito.mockingDetails (在Mockito 1.9.5中引入)来确定对象是模拟对象还是间谍对象。

第4章:使用Mockito进行行为驱动的开发

Mockito Essentials的第四章以介绍性句子开头:“本章探讨了行为驱动开发(BDD)以及BDD如何帮助您最大程度地减少项目失败风险。” 本章介绍了自上而下和自下而上的方法 ,以及每种方法为BDD设置上下文时遇到的问题。 然后,本章介绍行为驱动的开发,并参考Martin Fowler的TestDrivenDevelopment和域驱动的设计以及软件开发的敏捷方法 。 然后,本章参考并总结了Dan North的BDD简介 。

总结了BDD之后,第4章转到“用Mockito执行BDD”。 本节介绍BDDMockito及其静态给定(T)方法。 包括使用此类和方法的示例,并简要描述了支持BDD的Mockito语法。

Mockito Essentials的第4章对Mockito BDD支持的介绍只是本章的一小部分。 对于刚接触BDD的开发人员,整章值得阅读,以概述BDD旨在解决的问题。 对于已经熟悉BDD概念的人员,他们只是想了解如何使用Mockito来实现BDD测试,本章的最后三页就足够了。 对于对BDD不感兴趣的开发人员,可以跳过整章。

第5章:使用Mockito对遗留代码进行单元测试

Mockito Essentials的第5章首先介绍了遗留代码 ,并从《 有效使用遗留代码 》一书中引用和引用,并描述了遗留代码难以使用的原因。 然后,本章描述了测试框架和Java语言如何要求开发人员更改其他方面的良好设计以实现可测试性。 面对这一挑战,本章介绍PowerMock 。

Mockito Essentials的第五章指出:“ Mockito可以做PowerMock可以做的事情,但这不是因为这些都是测试气味,强烈表明您遵循的是不良的设计。” 作者继续介绍一些无需使用PowerMock即可重构代码以使其更具可测试性的典型方法。 然后作者断言:“ PowerMock是遗留代码的后备,它们应旨在随着时间的推移而停止使用。” 陈述了这些警告之后,本章可以很好地简洁地描述什么是PowerMock以及它如何能够提供“其特殊的模拟功能”。

第五章提供了有关PowerMock信息和下载PowerMock的链接 ,然后介绍了如何使用PowerMockito 。 本章的几个部分描述了如何应用“ PowerMockito的不可测试结构的模拟功能”,例如,对静态方法进行存根,抑制静态块,抑制超类构造函数和类自己的构造函数,抑制方法,对私有方法和最终方法进行存根以及模拟期末课程。

第五章“使用Mockito设计可测试性”一节“介绍了可测试性设计,或者是代码中应避免的事情。” 本节不一定专门针对Mockito,因为它涵盖了大多数模拟框架和单元可测试性所共有的问题。 就描述不可模拟的代码模式和习惯用法以及提出一种或多种替代方法以提高其被模拟的能力而言,此讨论非常有用。 在讨论过程中特别提到了Mockito,但主要是提醒读者,要进行Mockito的模拟,需要重构要测试的代码结构。 在本节中反复强调,将“测试障碍”放置在这些不可模拟的代码构造中会阻止对它们进行单元测试,并将这些测试障碍移动到可模拟的代码中,从而可以在模拟测试障碍的同时对其他部分进行单元测试直接与他们打交道。

第6章:使用Mockito开发SOA

Mockito Essentials的第六章开头指出,该章“探讨Web服务,Web服务样式-基于SOAP和RESTful的Web服务组件,以及使用Mockito构建和进行SOAP和RESTful Web服务的单元测试。” 本章首先简要介绍了面向服务的体系结构 (SOA)以及通常与SOA相关的优点和特征。 它从这个简短的介绍到SOA过渡到Web服务 ,并提出“ SOA可以依靠Web服务来实现异构应用程序和技术之间的互操作性”。

第6章对Web服务的介绍介绍了Web服务的基本特征,而没有区分基于SOAP的Web服务和基于REST的Web服务。 然后介绍了JAX-WS和JAX-RS 。

要点的Mockito第六章开始其更加深入地了解SOAP通过上市的简要介绍特性的Web服务的WSDL和简要描述了两种最常见的方法与构建基于SOAP的Web服务JAX-WS ( 自上而下 /合约─首先和自底向上 / Java优先)。 关于JAX-WS开发的部分提供了有关文本和屏幕快照的全面介绍,以及如何将Eclipse与Apache Tomcat和Apache Axis一起使用来编写和部署基于JAX-WS / SOAP的Web服务和客户端。 本节还描述并说明了重构代码以使其更具可测试性,然后对其进行测试并使用Mockito进行模拟。 我发现这些工具使使用JAX-WS变得可以忍受,因此毫不奇怪的是,这是一个工具繁重的部分,也是Mockito Essentials少数几个对Eclipse的行为至关重要的部分之一。

第6章还深入探讨了使用JAX-RS开发和测试基于REST的Web服务。 本节首先对REST和REST的基本概念(例如HTTP,URI,HTTP状态,HATEOAS等)进行高级别概述。然后,涵盖范围转向“使用Spring Framework构建RESTful Web服务”。 该部分的开头是一句话,“该部分描述了Spring MVC架构以及如何使用Spring MVC对RESTful Web应用程序进行单元测试。” 像JAX-WS上的这一部分一样,本部分提供了使用Mockito模拟某些方面来开发和测试基于JAX-RS / Spring的RESTful Web服务的全面概述。

第7章:使用Mockito进行单元测试GWT代码

Mockito Essentials的最后一章“提供了Ajax / GWT的概述,解释了Model View Presenter(MVP)模式和松耦合,并提供了使用Mockito模拟GWT小部件的示例和策略。” 本章从Ajax简介和使用Ajax ( XMLHttpRequest )JavaScript代码示例开始。

第7章介绍了Google Web Toolkit ( GWT )的吸引力,因为它在开发和测试方面隐藏了JavaScript的一些怪癖,并列出了GWT的一些优点。 “学习MVP模式”部分介绍了如何使用GWT来实现具有Model-View-Presenter设计模式的应用程序,并提供有关MVP的背景说明。

第7章的“使用MVP开发GWT应用程序”部分演示了如何使用Eclipse使用Google Web Toolkit创建Web应用程序,将Java代码编译为JavaScript代码以及构建整个应用程序。 这是一个冗长而详细的部分,可以看作是有关使用GWT的教程。 这是一个完全不同的部分,即“对GWT代码进行单元测试”,该部分介绍了对GWT代码进行单元测试(并使用Mockito)。 除了讨论在GWT测试中使用PockerMockito之外,本节还介绍GWTMockUtilities和GWTTestCase 。 我几乎没有接触过Google Web Toolkit,也没有意识到它对单元测试的重要支持 。 我也赞赏本节对HtmlUnit的引用。

第7章的“摘要”部分实际上是一本书的摘要,而不是一章的摘要。

一般观察

  • 我查看过的Mockito Essentials PDF版本中的代码清单是白色背景上的黑色字体,没有颜色语法,也没有行号。 在许多Java清单中, 大胆强调了Java关键字,类属性的名称,变量的名称以及文字字符串。
  • 尽管Eclipse是作者使用和引用的IDE,但是Java开发人员应该能够使用他或她喜欢的IDE。 对Eclipse的大多数引用都可以轻松转换为其他现代Java IDE,例如NetBeans和IntelliJ IDEA 。 值得注意的例外是使用Eclipse生成JAX-WS工件和生成Google Web Toolkit应用程序的演示。
  • 尽管大多数Mockito Essentials都相对容易阅读(我在这篇评论中包括了几个直接引号,以尝试建立相对容易理解的写作风格),但仍有一些错别字和明显笨拙的句子可以使某些事情成为可能。有点难以理解,使我相信应该进行另一次编辑。 以下是一些示例,可让您大致了解错别字和尴尬的句子:
    • 引用了方法名称“ FindalMethodDependency”(小写的“ d”)
  • 我喜欢Mockito Essentials包含指向相关教程,博客文章,文章和工具网站的链接。 在电子版中,这尤其方便,易于复制和粘贴。
  • 尽管其名称为Mockito Essentials ,但本书涵盖的内容不只是Mockito Essentials
    • 它相对大量地介绍了基于SOAP和基于REST的Web服务以及使用Google Web Toolkit和Spring MVC开发Web应用程序。
  • 我很乐意为希望了解有关Mockito基本知识和用法的开发人员推荐Mockito Essentials 。 对我而言,最重要的警告是Mockito提供了出色的在线文档,并且在其API页面上对Mockito的许多最常见用例进行了详细描述(截至撰写本文时,包含22个代码段和描述)。

结论

Mockito Essentials涵盖了Mockito的基础知识,并提供了一些现实的示例,说明了如何使用Mockito模拟基于Java的应用程序的某些部分,这些部分否则会违反单元测试的基本原则,并使单元测试的效率降低。 Mockito Essentials提供了将Mockito与其他工具和框架(如PowerMock,Google Web ToolKit,JAX-WS和JAX-RS)一起应用的详细示例。 在此过程中,介绍并解释了许多编写有效测试和进行有效模拟的普遍接受的做法。

翻译自: https://www.javacodegeeks.com/2015/01/book-review-mockito-essentials.html

mockito

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

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

相关文章

C语言中quot;##quot;的独特用法

市面上有很多比较火的编程语言,比如Python、 JAVA、 Go等,你可能觉得C语言很古老、很落后。如果你有这种想法,那可能你只是一个初学的菜鸟。可能绝大部分 C 程序员都不知道"##"隐藏用法,下面就来给大家讲讲。一、##的“…

html a标签去掉下划线_如何用HTML基本元素制作表格

第2天【HTML基本元素】主要内容标题标签段落标签强制换行水平线图片超链接文本格式化标签列表表格学习目标一、标题标题&#xff08;Heading&#xff09;是通过 <h1> - <h6> 标签进行定义的。<h1> 定义最大的标题。 <h6> 定义最小的标题。标题很重要请…

C语言中几个容易踩的“坑”!

今天给大家分享几个C语言中的坑。一、带参数的宏展开顺序#include #define f(a,b) a##b #define g(a) #a #define h(a) g(a)int main(void) {printf("%s\n",h(f(1,2)));printf("%s\n",g(f(1,2)));return 0; }运行结果:12f(1,2)浅析&#xff1a;本题中的#运…

dockerfile cd目录_使用Werf和现有的Dockerfiles改善你的CI/CD体验

迟到总比不到好。该故事讲关于我们因不支持使用常规的Dockerfile来构建镜像导致我们差点犯了一个重大错误。Werf[1]是一个GitOps工具&#xff0c;可以很好地集成到任何CI/CD系统中&#xff0c;并提供完整的应用程序生命周期管理&#xff0c;允许你&#xff1a;构建和推送镜像部…

alxc tool 报错数组超出了界限_代码审计之报错信息泄露与字符串截断

机器在语言编码转换的时候&#xff0c;经常会出现各种各样的异常&#xff0c;这些神奇的字符串就有可能组合成一堆乱码出来&#xff0c;也有可能直接把程序搞崩溃掉&#xff0c;不过总有那么一些字符&#xff0c;可以帮助我们在利用漏洞的时候变得更简单一些&#xff0c;下面我…

C语言,去你的策略模式!

前言 这里先插一点题外话&#xff0c;在C语言中&#xff0c;实现封装、继承、隐藏、多态等等特性&#xff0c;是完全没有问题的。但是在使用过程中&#xff0c;必定是不如自带这些特性的语言方便好用的&#xff0c;比如C \java等。一旦要通过C语言来实现各种设计模式&#xff0…

eager_EAGER的获取是代码的味道

eager介绍 Hibernate获取策略确实可以使几乎没有爬网的应用程序和响应Swift的应用程序有所不同。 在这篇文章中&#xff0c;我将解释为什么您应该选择基于查询的获取而不是全局获取计划。 取得101 Hibernate定义了四种关联检索策略 &#xff1a; 提取策略 描述 加入 原始S…

什么时候会是用treeset?_flex:1 到底代表什么?

今天在做项目的时候遇到一个关于布局的问题, 就是 flex: 1; 我一直以为 flex: 1; 代表的是 flex: aoto; 后来发现结果并不是这样, 所以写一篇博客来讲解一下 flex: 1; 代表什么代码第一版<div class"container"><div class"div">我是一个div&l…

纠缠不清的C语言位域(位段)详解

位域是什么&#xff1f;有些数据在存储时并不需要占用一个完整的字节&#xff0c;只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态&#xff0c;用 0 和 1 表示足以&#xff0c;也就是用一个二进位。正是基于这种考虑&#xff0c;C语言又提供了一种叫做位域的…

matlab画累计直方图_科学网—matlab 绘制直方图——常用命令 - 范凯波的博文

直方图上显示数值close all ,x rand(100,1);%获得直方图的数据[n,y] hist(x);maxN max(n);%设置显示x,y长度限制axis([0 1.2 0 maxN2])%根据直方图的数据绘制出图形bar(y,n);for i 1:length(y)%直方图上面数据对不齐&#xff0c;利用水平和垂直对齐 &#xff0c;可以参考se…

django debug=false后静态文件丢失_python框架Django实战商城项目之工程搭建

项目说明 该电商项目类似于京东商城&#xff0c;主要模块有验证、用户、第三方登录、首页广告、商品、购物车、订单、支付以及后台管理系统。 项目开发模式采用前后端不分离的模式&#xff0c;为了提高搜索引擎排名&#xff0c;页面整体刷新采用jinja2模板引擎实现&#xff0c;…

mysql解压缩 1067_windows安装mysql8.0.0解压版附出现1067错误解决方法

1、自己到mysql官网下载mysql-8.0.0-dmr-winx64.zip解压缩安装包2、下载页面地址&#xff1a;https://dev.mysql.com/downloads/mysql/3、解压缩到任意目录(我自己是D:\DevTools\mysql-8.0.0)4、配置环境变量添加path路径为你的mysql8.0.0路径下面的bin目录(我的目录是D:\DevTo…

基于C语言的函数指针应用-消息命令处理框架

简述大家都知道&#xff0c;在C语音中指针的地位很重要&#xff0c;各种指针&#xff0c;功能很强大&#xff01;但是用不好&#xff0c;指针也比较容易出问题。这里介绍的是函数指针的一种应用方法&#xff0c;即使用函数指针来实现消息命令的注册与回调处理。代码测试的处理函…

easyexcel 动态列_easyexcel动态表头列导出SequenceDiagram 阅读源码事半功倍

EasyExcel简介Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解压后存储都是…

python3进阶_Python3 进阶教程 2020全新版

REVENGE_7771天前如果不创建class类的话&#xff0c;直接使用dog.name是会报错的&#xff0c;因为一般数据类型不接受这种调用方式0赞 0采集潘某人永不屈服2天前class Student()定义的时候&#xff0c;需要在括号内写明继承的类Person在__init__()方法&#xff0c;需要调用sup…

C语言中的输入输出

在C语言中提供了许多内置的输入输出函数。标准文件的定义在C语言中会把所有设备当文件来处理。为了访问键盘和屏幕&#xff0c;以下三个文件会在程序执行时而打开。标准文件文件指针设备标准输入stdin键盘标准输出stdout屏幕标准错误stderr屏幕C 语言中的输入/输出通常使用内置…

lambda 延迟执行_Java Lambdas和低延迟

lambda 延迟执行总览 有关在Java和低延迟中使用Lambda的主要问题是&#xff1a; 他们会产生垃圾吗&#xff0c;您能做些什么吗&#xff1f; 背景 我正在开发一个支持不同有线协议的库。 这个想法是&#xff0c;您可以描述要写入/读取的数据&#xff0c;并且有线协议确定它是否…

C语言“悬空指针”和“野指针”究竟是什么意思?

各位&#xff0c;提起C语言我们很自然就会想到指针二字&#xff0c;没错&#xff0c;作为C的核心和灵魂&#xff0c;它的地位咱们就不再赘述了&#xff0c;今天我们想跟大家讲的是指针中的两个特有名词&#xff1a;“悬空指针”和“野指针”。悬空指针C语言中的指针可以指向一块…

grad在python什么模块_深度学习(Deep Learning)基础概念1:神经网络基础介绍及一层神经网络的python实现...

此专栏文章随时更新编辑&#xff0c;如果你看到的文章还没写完&#xff0c;那么多半是作者正在更新或者上一次没有更新完&#xff0c;请耐心等待&#xff0c;正常的频率是每天更新一篇文章。 该文章是“深度学习&#xff08;Deep Learning&#xff09;”系列文章的第一部分&…

ubuntu终端命令停止_从命令行关闭Linux计算机的5种方法

没有操作系统是完美的。 即使相对稳定,驱动程序和应用程序也可能存在问题。 Linux也不例外。 尽管比Windows更稳定(在许多情况下,并非全部!),但可能还需要重新启动Linux计算机。 这可能是因为某些东西不起作用。 或者,您可能通过SSH连接到远程计算机或服务器,并希望它重新…