适用于Idea的面向现代TDD的Java 8 JUnit测试模板(带有Mockito和AssertJ)
使用類似BDD的語法,Java 8和Mockito-AssertJ二重奏為Idea調(diào)整JUnit測(cè)試類模板。
本文涵蓋的主題似乎很簡(jiǎn)單。 但是,根據(jù)我的培訓(xùn)師經(jīng)驗(yàn),我知道(不幸的是)這不是常見的做法。 因此,我決定寫這篇簡(jiǎn)短的博客文章來傳播它們,并在將來能夠引用它。
我最喜歡的Java(和Groovy)測(cè)試框架是Spock 。 但是,它的模擬不適用于某些目的,我仍然在各種地方使用Mockito。 此外,我仍然針對(duì)已經(jīng)在該堆棧中具有測(cè)試套件并且希望在不更改已知技術(shù)的情況下提高其技能的團(tuán)隊(duì),在JUnit / Mockito / AssertJ變體中進(jìn)行很多測(cè)試培訓(xùn) 。 因此,作為一個(gè)插曲,此博客文章介紹了純Java風(fēng)格的測(cè)試,并假設(shè)您已經(jīng)在使用Mockito和AssertJ(如果在其他情況下,請(qǐng)嘗試一下),則建議如何調(diào)整JUnit測(cè)試框架。
此博客文章由樹部分組成。 首先,我提出了一種BDD樣式的基于節(jié)的測(cè)試結(jié)構(gòu),以使您的測(cè)試更一致,更易讀。 接下來,我將說明如何使用Java 8使用AssertJ和Mockito進(jìn)行簡(jiǎn)化。最后但并非最不重要的一點(diǎn)是,我將展示如何在IntelliJ IDEA中將其配置為默認(rèn)的JUnit測(cè)試(類)模板(這并不簡(jiǎn)單)這應(yīng)該)。
第1部分。BDD樣式的部分
編寫良好的單元測(cè)試應(yīng)滿足幾個(gè)要求(但這是單獨(dú)發(fā)布的主題)。 有用的做法之一是將3個(gè)代碼塊明確劃分為具有明確定義的職責(zé)。 您可以在我以前的博客文章中閱讀有關(guān)該主題的更多信息 。
作為重復(fù),僅以簡(jiǎn)短形式列出了核心規(guī)則:
- given –測(cè)試中的對(duì)象初始化+存根/模擬的創(chuàng)建,存根和注入
- when –在給定測(cè)試中進(jìn)行測(cè)試的操作
- then –收到結(jié)果聲明+模擬驗(yàn)證(如果需要)
這種分離有助于保持測(cè)試的簡(jiǎn)短性,并將重點(diǎn)放在測(cè)試的一項(xiàng)責(zé)任上(最終這只是一個(gè)單元測(cè)試)。
在Spock中,這些部分是必填(*)–沒有它們,測(cè)試甚至無法編譯。 在JUnit中只有注釋。 但是,將它們放置在適當(dāng)位置會(huì)鼓勵(lì)人們使用它們,而不是在內(nèi)部放置一大堆混亂(對(duì)于在測(cè)試區(qū)域中的新手尤其有用)。
順便說一句,提到的“先給后定”約定基于更廣泛的“ 行為驅(qū)動(dòng)開發(fā)”概念(是其子集)。 您可能會(huì)在3個(gè)代碼塊上遇到類似的劃分,這些代碼塊稱為ranging-act-assert,通常等效。
第2部分。AssertJ和Mockito的Java 8
Java 8的功能之一是能夠?qū)⒛J(rèn)方法放入接口中。 這可以用來簡(jiǎn)化對(duì)靜態(tài)方法的調(diào)用,這在測(cè)試框架(如AssertJ和Mockito)中很普遍。 這個(gè)想法很簡(jiǎn)單。 愿意使用給定框架的測(cè)試類可以實(shí)現(xiàn)專用接口,以在IDE中完成代碼時(shí)將這些方法“視為”它們自己的方法(而不是外部類的靜態(tài)方法,這些方法要求在輸入類名之前或靜態(tài)導(dǎo)入) 。 那些默認(rèn)方法只是將執(zhí)行委托給靜態(tài)方法。 您可以在我的其他博客文章中了解更多信息 。
AssertJ本機(jī)支持從3.0.0版本開始的那些構(gòu)造。 Mockito 1.10和2.x與Java 6兼容,因此需要使用一個(gè)第三方項(xiàng)目– mockito-java8 (一旦可用,應(yīng)將其集成到Mockito 3中)。
為了從Idea中更輕松的方法完成中受益,實(shí)現(xiàn)兩個(gè)接口就足夠了:
import info.solidsoft.mockito.java8.api.WithBDDMockito; import org.assertj.core.api.WithAssertions;class SampleTest implements WithAssertions, WithBDDMockito {}第3部分。Idea中的默認(rèn)模板
我是無所不在的自動(dòng)化的狂熱愛好者。 在測(cè)試類中同時(shí)自動(dòng)設(shè)置“先給定”部分和額外的接口,這不是很好嗎? 讓我們從生活中消除那些無聊的事情。
測(cè)試方法
更改JUnit測(cè)試方法很容易。 一種可能的方式是“ CTRL-SHIFT-A->文件模板->代碼”,并將JUnit4 Test Method修改為:
@org.junit.Test public void should${NAME}() {//given${BODY}//when//then }要在現(xiàn)有測(cè)試類中添加新測(cè)試,只需按ALT-INSERT并選擇(或鍵入) JUnit4 Test Method 。
測(cè)試班
在整個(gè)測(cè)試課程中,情況要復(fù)雜一些。 Idea提供了一種編輯現(xiàn)有模板的方法,但是,僅當(dāng)使用生產(chǎn)類中的CTRL-SHIFT-T生成測(cè)試時(shí)才使用該方法。 對(duì)于TDD,首先要?jiǎng)?chuàng)建一個(gè)測(cè)試不是很方便。 如果在測(cè)試上下文中的程序包視圖中按了ALT-INSERT則最好在“ Java類”旁邊顯示一個(gè)新位置“ New JUnit測(cè)試類”。 不幸的是,要做到這一點(diǎn),就需要編寫一個(gè)新插件(Spock的示例實(shí)現(xiàn) )。 作為解決方法,我們可以定義一個(gè)常規(guī)文件模板(作為限制),該模板可在任何地方(例如,即使在資源目錄中)訪問。
執(zhí)行“ CTRL-SHIFT-A->文件模板->文件”,按INSERT ,將模板命名為“具??有AssertJ和Mockito Test的JUnit”,將擴(kuò)展名設(shè)置為“ java”,然后粘貼以下模板:
package ${PACKAGE_NAME};import info.solidsoft.mockito.java8.api.WithBDDMockito; import org.assertj.core.api.WithAssertions;#parse("File Header.java") public class ${NAME} implements WithAssertions, WithBDDMockito {}展示柜
我們已經(jīng)準(zhǔn)備好了。 讓我們檢查一下它在實(shí)際中的外觀(單擊以放大動(dòng)畫)。
摘要
我希望我說服您調(diào)整測(cè)試模板以提高測(cè)試的可讀性并確保每個(gè)測(cè)試幾次擊鍵。 在這種情況下,請(qǐng)立即花費(fèi)4分鐘在您的Idea中對(duì)其進(jìn)行配置。 根據(jù)編寫的許多測(cè)試,它可能會(huì)比您期望的更快開始回報(bào):)。
順便說一句,十月初,我將在克拉科夫的JDD 上介紹 Mockito 2的新功能。
自我提升 。 您想快速有效地提高您和您的團(tuán)隊(duì)的測(cè)試技能以及對(duì)Spock / JUnit / Mockito / AssertJ的了解嗎? 我進(jìn)行了濃縮(單元) 測(cè)試培訓(xùn) ,您可能會(huì)覺得有用。
翻譯自: https://www.javacodegeeks.com/2017/09/modern-tdd-oriented-java-8-junit-test-template-idea-mockito-assertj.html
總結(jié)
以上是生活随笔為你收集整理的适用于Idea的面向现代TDD的Java 8 JUnit测试模板(带有Mockito和AssertJ)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中秋国庆假期火车票明日开售:“12306
- 下一篇: 历时近十年,川青铁路青白江至镇江关段今日