日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

mockito入门_Mockito入门

發(fā)布時(shí)間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mockito入门_Mockito入门 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

mockito入門

本文是我們名為“ 用Mockito測(cè)試 ”的學(xué)院課程的一部分。

在本課程中,您將深入了解Mockito的魔力。 您將了解有關(guān)“模擬”,“間諜”和“部分模擬”的信息,以及它們相應(yīng)的存根行為。 您還將看到使用測(cè)試雙打和對(duì)象匹配器進(jìn)行驗(yàn)證的過(guò)程。 最后,討論了使用Mockito的測(cè)試驅(qū)動(dòng)開發(fā)(TDD),以了解該庫(kù)如何適合TDD的概念。 在這里查看 !

目錄

1.為什么要模擬? 2. Mockito框架簡(jiǎn)介
2.1。 存根的快速示例 2.2。 快速驗(yàn)證示例
3.混合一個(gè)Mockito 4.將Mockito與JUnit一起使用 5. Mockito最佳做法

在本教程中,我們將研究Mockito Mocking Framework,并通過(guò)將其添加到類路徑中來(lái)準(zhǔn)備一個(gè)Eclipse項(xiàng)目來(lái)使用它。

1.為什么要模擬?

我們編寫的所有代碼都有一個(gè)相互依賴的網(wǎng)絡(luò),它可以調(diào)用其他幾個(gè)類的方法,而這些類又可以調(diào)用其他方法。 確實(shí),這就是面向?qū)ο缶幊痰囊鈭D和力量。 通常在編寫功能代碼的同時(shí),我們還將以自動(dòng)化單元測(cè)試的形式編寫測(cè)試代碼。 我們使用這些單元測(cè)試來(lái)驗(yàn)證代碼的行為,以確保其行為符合我們的預(yù)期。

當(dāng)我們對(duì)代碼進(jìn)行單元測(cè)試時(shí),我們希望對(duì)其進(jìn)行隔離測(cè)試,并希望對(duì)其進(jìn)行快速測(cè)試。 為了進(jìn)行單元測(cè)試,我們只關(guān)心在當(dāng)前測(cè)試的類中驗(yàn)證自己的代碼。 通常,我們還希望非常定期地執(zhí)行單元測(cè)試,重構(gòu)時(shí)以及在持續(xù)集成環(huán)境中工作時(shí),每小時(shí)可能要執(zhí)行多次。

這是我們所有相互依存成為問(wèn)題的時(shí)候。 我們可能最終在另一個(gè)類中執(zhí)行代碼,該類中的錯(cuò)誤導(dǎo)致導(dǎo)致單元測(cè)試失敗。 想象一下我們用來(lái)從數(shù)據(jù)庫(kù)中讀取用戶詳細(xì)信息的類,如果要運(yùn)行單元測(cè)試時(shí)沒(méi)有數(shù)據(jù)庫(kù),會(huì)發(fā)生什么? 想象一下,一個(gè)調(diào)用多個(gè)遠(yuǎn)程Web服務(wù)的類,如果它們出現(xiàn)故障或需要很長(zhǎng)時(shí)間響應(yīng)怎么辦? 我們的單元測(cè)試可能由于我們的依賴關(guān)系而失敗,而不是因?yàn)槲覀兊拇a行為出現(xiàn)問(wèn)題。 這是不希望的。

除此之外,強(qiáng)制執(zhí)行想要確保代碼正確處理的特定事件或錯(cuò)誤條件可能非常困難。 如果我們要測(cè)試某個(gè)反序列化對(duì)象的類如何正確處理可能的ObjectStreamException怎么辦? 如果我們要測(cè)試協(xié)作者的所有邊界返回值怎么辦? 確保將某些計(jì)算值正確傳遞給協(xié)作者該怎么辦? 如果可能的話,復(fù)制我們的測(cè)試條件可能需要花費(fèi)大量的代碼和較長(zhǎng)的時(shí)間。

如果使用模擬,所有這些問(wèn)題都會(huì)消失。 嘲笑就像是我們與之合作的類的替代品一樣,它們?nèi)〈怂麄兊奈恢?#xff0c;并按照我們告訴他們的行為去做。 嘲弄讓我們假裝我們真正的合作者在那里,即使他們不在。 更重要的是,可以對(duì)模擬程序進(jìn)行編程,以返回我們想要的任何值并確認(rèn)將任何值傳遞給它們。 模擬程序立即執(zhí)行,不需要任何外部資源。 假人會(huì)返回我們告訴他們的東西,拋出我們想讓他們拋出的任何異常,并將按需一遍又一遍地執(zhí)行這些操作。 他們讓我們僅測(cè)試我們自己代碼的行為,以確保我們的類能夠正常工作,而不管其協(xié)作者的行為如何。

有幾種可用于Java的模擬框架,每種都有各自的語(yǔ)法,各自的優(yōu)勢(shì),各自的劣勢(shì)。 在本教程中,我們將使用Mockito框架,它是最流行的可用模擬框架之一。

2. Mockito框架簡(jiǎn)介

Mockito是一個(gè)Mocking框架,可以很容易地為要與您的被測(cè)類進(jìn)行交互的類和接口創(chuàng)建模擬。 Mockito提供了一個(gè)非常簡(jiǎn)單的API,用于創(chuàng)建模擬并分配其行為。 它使您可以非常快速地指定預(yù)期的行為并驗(yàn)證與模擬的交互。

Mockito本質(zhì)上具有兩個(gè)階段,其中一個(gè)或兩個(gè)階段都作為單元測(cè)試的一部分執(zhí)行:

  • 存根
  • 驗(yàn)證

存根是指定模擬行為的過(guò)程。 這就是我們告訴Mockito與模擬互動(dòng)時(shí)想要發(fā)生的事情的方式。 存根使我們能夠解決我們?cè)诘谝徊糠种懈攀龅囊恍﹩?wèn)題–它使為測(cè)試創(chuàng)建所有可能的條件變得簡(jiǎn)單。 它讓我們控制了模擬的響應(yīng),包括強(qiáng)迫它們返回我們想要的任何值,或者拋出我們想要的任何異常。 它使我們可以在不同條件下編寫不同的行為。 存根使我們可以精確控制模擬將執(zhí)行的操作。

驗(yàn)證是驗(yàn)證與我們的模擬互動(dòng)的過(guò)程。 它使我們能夠確定模擬的調(diào)用方式以及調(diào)用的次數(shù)。 它使我們可以查看模擬的參數(shù),以確保它們符合預(yù)期。 驗(yàn)證使我們能夠解決第一節(jié)中提到的其他問(wèn)題–它使我們確保將我們期望的值準(zhǔn)確地傳遞給我們的合作者,并且不會(huì)發(fā)生意外情況。 驗(yàn)證使我們能夠準(zhǔn)確確定模擬發(fā)生了什么。

通過(guò)將這兩個(gè)簡(jiǎn)單的階段聯(lián)系在一起,我們可以構(gòu)建極其靈活且功能強(qiáng)大的單元測(cè)試,使用非常簡(jiǎn)單的Mockito API編碼復(fù)雜的模擬行為和復(fù)雜的模擬交互驗(yàn)證。

Mockito確實(shí)有一些限制,包括

  • 你不能嘲笑期末班
  • 您不能模擬靜態(tài)方法
  • 您不能模擬最終方法
  • 您不能模擬equals()或hashCode()

存根的快速示例

想象一下,您正在編寫一個(gè)調(diào)用物理溫度傳感器API的類。 您要調(diào)用double getDegreesC()方法并基于從傳感器返回的值返回以下字符串之一:“ Hot”,“ Mild”,“ Cold”。 至少可以說(shuō),要使單元測(cè)試控制房間的環(huán)境溫度以測(cè)試功能非常困難。 但是,如果我們使用Mockito來(lái)創(chuàng)建替代傳感器的模擬物,該怎么辦?

現(xiàn)在我們可以在單元測(cè)試中編寫如下代碼:

when(sensor.getDegreesC()).thenReturn(15.0);

這告訴Mockito,當(dāng)模擬傳感器收到對(duì)getDegreesC()的調(diào)用時(shí),它應(yīng)該然后返回值15.0。

快速驗(yàn)證示例

假設(shè)您有一個(gè)類進(jìn)行一些計(jì)算,并負(fù)責(zé)在觀察者完成計(jì)算后通知觀察者。 您想確保在執(zhí)行方法的過(guò)程中一次調(diào)用了觀察者的notify()方法。 您可以在觀察器中設(shè)置一些布爾值,然后從單元測(cè)試中進(jìn)行檢查,但這意味著更改一些生產(chǎn)代碼,甚至您可能都不擁有這些代碼。 Mockito怎么樣,如果觀察者是模擬的呢?

現(xiàn)在我們可以在單元測(cè)試中編寫如下代碼:

verify(observer).notify();

這告訴Mockito必須僅一次調(diào)用一次notify()方法,否則單元測(cè)試應(yīng)該失敗。

3.混合一個(gè)Mockito

現(xiàn)在,我們已經(jīng)了解了一些有關(guān)框架的知識(shí),讓我們?cè)陧?xiàng)目中使用它。

如果使用Maven,則將Mockito添加到項(xiàng)目中就像添加以下依賴項(xiàng)一樣簡(jiǎn)單:

<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId><version>1.9.5</version><scope>test</scope></dependency>

如果您使用Gradle,則只需添加以下內(nèi)容

dependencies {testCompile "org.mockito:mockito-all:1.9.5" }

要將舊版Mockito添加到Eclipse項(xiàng)目的類路徑中,請(qǐng)從Mockito下載頁(yè)面中獲取最新的jar( 取名為 mockito-all-1.9.5.jar)并將其下載到硬盤上。

右鍵單擊您的eclipse項(xiàng)目,然后選擇“屬性”,然后在左窗格中選擇“ Java Build Path”,然后在右側(cè)選擇“ Libraries”。

在“庫(kù)”選項(xiàng)卡上,單擊“添加外部Jar”按鈕,然后導(dǎo)航到您先前下載的模擬所有jar。 選擇罐子,它現(xiàn)在已添加到您的項(xiàng)目中并可供使用。

在撰寫本文時(shí),Mockito的最新版本是1.9.5,但是在將其添加到項(xiàng)目之前,應(yīng)檢查更新。

4.將Mockito與JUnit一起使用

要將Mockito集成到您的JUnit測(cè)試類中,可以使用提供的Test Runner MockitoJUnitRunner 。 只需使用以下注釋您的測(cè)試課:

@RunWith(MockitoJUnitRunner.class)

這告訴Mockito在測(cè)試類中接受所有帶注釋的模擬,并對(duì)其進(jìn)行初始化以進(jìn)行模擬。 然后,您可以簡(jiǎn)單地使用@Mock注釋任何實(shí)例變量以將其用作模擬。 請(qǐng)注意,您應(yīng)該導(dǎo)入org.mockito.Mock而不是org.mockito.mockitoannotations.Mock (已棄用)。

與所有示例一樣,我們將創(chuàng)建一個(gè)新的Test類,并在其中使用Mockito模擬java.util.List :

import java.util.List; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner;@RunWith(MockitoJUnitRunner.class) public class MyTest {@Mockprivate List<String> mockList;}

@Mock注釋告訴Mockito模擬mockList將被視為模擬,而@RunWith(MockitoJUnitRunner.class)告訴Mockito遍歷MyTest所有帶有@Mock注釋的成員,并將其初始化以進(jìn)行模擬。 您不必將任何新實(shí)例分配給嘲笑列表,這是由Mockito在后臺(tái)完成的。 通過(guò)上面的簡(jiǎn)單代碼,mockList準(zhǔn)備好用作模擬了。

嘗試添加以下導(dǎo)入:

import static org.junit.Assert.*; import static org.mockito.Mockito.*; import org.junit.Test;

然后是以下簡(jiǎn)單的測(cè)試用例:

@Testpublic void test() {String expected = "Hello, World!";when(mockList.get(0)).thenReturn(expected);String actual = mockList.get(0);assertEquals(expected, actual);System.out.println(actual);}

在這里,我們看到了我們的期望-我們有一個(gè)字符串"Hello, World!" 然后繼續(xù)對(duì)模擬列表的List.get()方法進(jìn)行存根, List.get()在請(qǐng)求列表的第一個(gè)元素時(shí)返回期望的String。

然后,我們調(diào)用mockList.get(0)以獲取測(cè)試的實(shí)際值,并斷言我們的實(shí)際值等于我們的預(yù)期值,然后將其輸出到控制臺(tái)以進(jìn)行良好測(cè)量。

我們根本沒(méi)有創(chuàng)建真實(shí)列表,也沒(méi)有插入“ Hello,World!” 進(jìn)入列表。 它只是一個(gè)模擬列表,它具有或知道的唯一功能是輸入為0的get()方法。

嘗試更改String actual = mockList.get(0); 到String actual = mockList.get(1); 并運(yùn)行測(cè)試。 您將看到actual值現(xiàn)在為空。 原因是我們唯一保留的功能是使用輸入0調(diào)用.get()– Mockito不知道如何使用輸入1進(jìn)行操作,因此它僅返回null。 實(shí)際上,我們調(diào)用List的任何其他方法都將返回null,而任何不返回任何值的方法將有效地充當(dāng)no-op。 這是一個(gè)功能強(qiáng)大的控件,在幾行代碼中,我們創(chuàng)建了List的實(shí)現(xiàn),該實(shí)現(xiàn)恰好在每次調(diào)用它時(shí)都可以實(shí)現(xiàn)我們想要的功能。

5. Mockito最佳做法

Mockito通常鼓勵(lì)在單元測(cè)試和設(shè)計(jì)中采用標(biāo)準(zhǔn)的最佳實(shí)踐,即:

  • Mockito沒(méi)有模擬靜態(tài)方法的規(guī)定,因?yàn)镸ockito鼓勵(lì)面向?qū)ο蟮脑O(shè)計(jì)和對(duì)過(guò)程代碼的依賴注入。
  • Mockito沒(méi)有提供模擬私有方法的規(guī)定,因?yàn)楣卜椒☉?yīng)該是黑盒,并且從測(cè)試私有方法的角度來(lái)看不存在。
  • Mockito打包并鼓勵(lì)使用Hamcrest Matchers,這將在后續(xù)教程中介紹。
  • Mockito鼓勵(lì)遵守Demeter法則,而不鼓勵(lì)嘲笑鏈?zhǔn)椒椒ā?
  • 您不應(yīng)存根或驗(yàn)證在不同線程之間共享的模擬。 但是,您可以調(diào)用共享模擬的方法。
  • 您無(wú)法驗(yàn)證模擬的toString()方法,原因是測(cè)試環(huán)境本身可能會(huì)調(diào)用它,因此無(wú)法進(jìn)行驗(yàn)證。
  • 如果您的測(cè)試用例使用了“當(dāng)時(shí)給定”表示法,則可以使用org.mockito.BDDMockito的存根方法,以便when(mock.method()).thenReturn(something)成為given(mock.method()).willReturn(something)因?yàn)樗鼘⒁阅臏y(cè)試格式很好地閱讀。
  • 可以在不使用Mockito批注的情況下使用Mockito,但是使用批注更加容易和整潔,這就是我們?cè)谶@些教程中將要做的。
  • 如果您的測(cè)試要求您出于測(cè)試目的修改類的特定方法的行為,則可以“監(jiān)視”任何類,包括被測(cè)類。 Mockito明確建議僅在偶爾使用間諜的情況下使用間諜,例如在處理遺留代碼的情況下。 這將在以后的教程中介紹。
  • 如果對(duì)間諜方法的實(shí)際調(diào)用可能會(huì)產(chǎn)生錯(cuò)誤條件,或者由于某些其他原因而無(wú)法調(diào)用,則Mockito建議使用do *系列方法進(jìn)行存根。 這將在以后的教程中介紹。
  • Mockito將允許您使用參數(shù)匹配器代替實(shí)際參數(shù),但有一個(gè)限制:如果一個(gè)參數(shù)使用匹配器,則所有參數(shù)都必須使用匹配器。 參數(shù)匹配器將在以后的教程中介紹,但應(yīng)謹(jǐn)慎使用。
  • Mockito提供了verifyNoMoreInteractions()方法來(lái)驗(yàn)證特定的模擬沒(méi)有更多的交互,但建議僅在適當(dāng)?shù)那闆r下謹(jǐn)慎使用。
  • Mockito提供了Answer接口以允許使用回調(diào)進(jìn)行存根,但建議不要使用它,并鼓勵(lì)您使用thenReturn()和doThrow()方法進(jìn)行簡(jiǎn)單的存根。 我們將在以后的教程中介紹答案。
  • 如果使用ArgumentCaptor進(jìn)行參數(shù)驗(yàn)證,則應(yīng)僅在驗(yàn)證階段而不是存根階段使用它。 ArgumentCaptor將在以后的教程中介紹。
  • Mockito建議非常小心地使用Partial Mocks,主要是在處理遺留代碼時(shí)。 設(shè)計(jì)良好的代碼不應(yīng)要求使用部分模擬。
  • Mockito提供了一個(gè)reset()方法,用于在測(cè)試方法的中間重置模擬,但是建議您不要使用它,因?yàn)樗且环N代碼氣味,可能會(huì)使您的測(cè)試過(guò)長(zhǎng)且過(guò)于復(fù)雜。

有更多的功能和做法,但是這些是Mockito告訴您要注意的主要功能和做法。 我們將在接下來(lái)的教程中介紹以上所有內(nèi)容,并進(jìn)行更深入的介紹。

翻譯自: https://www.javacodegeeks.com/2015/11/getting-started-with-mockito.html

mockito入門

總結(jié)

以上是生活随笔為你收集整理的mockito入门_Mockito入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。