Sujoy Acharya的Mockito Essentials副标题( Packt Publishing ,2014年10月)是:“实用指南,可帮助您使用Mockito进行单元测试并开始运行。” Mockito Essentials中的前言和七章涵盖大约190个实质性页面。
前言
在序言中,作者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