书评:Mockito Essentials
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
總結
以上是生活随笔為你收集整理的书评:Mockito Essentials的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何处理Java注释
- 下一篇: (svn linux命令)