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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mockito_吸收Mockito的流利度

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mockito_吸收Mockito的流利度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

mockito

我最近發現自己編寫了一些代碼來集成兩個不同的平臺。 這些系統之一是基于Java的系統,而另一個雖然不是用Java編寫的,卻提供了Java API。 我將這些系統分別稱為Foo和Bar。

在我編寫一行代碼之前就很明顯了,但是,測試最終的適配器將需要我顯式地模擬后來的系統的API(即Foo),因為我所需要的只是一個jar文件,其類和方法清楚了他們與一個實例進行了交流。

我花了幾個周期來查看Java 模擬世界中的新功能,并且很高興看到我的老朋友Mockito仍然很活躍,并且確實仍然是通用模擬的出色工具 。 對于初學者來說, Mockito是基于Java的模擬框架,它可以:

…味道真的很好。 它使您可以使用[a]簡潔的API編寫漂亮的測試。 Mockito不會給您帶來麻煩,因為測試的可讀性很強,并且會產生清晰的驗證錯誤。

Google代碼模擬項目頁面 –為什么喝呢?

實際上,Mockito提供了一個簡單,流暢的API ,使您可以精確地模擬行為而無需大驚小怪。 例如,與Bar進行交互的主要外觀是通過QTP類,該類具有諸如logIn , logOut等方法。與其依靠被測類實際調用這些方法,我還可以像這樣輕松地使用Mockito創建QTP模擬實例。 :

模擬QTP實例

QTP qtpThing = mock(QTP.class);

其中, mock是從org.mockito.Mockito靜態導入的方法。 使用模擬實例,然后我可以指示希望某些方法的行為, 只要我將此模擬實例傳遞給受測類即可 。

例如,方法logIn不返回任何內容。 實際上,必須先調用該方法,然后再調用另一種方法以生成票證(或令牌),該票證將在后續方法調用中使用。 因此,我正在編寫的適配器將接收一些輸入值(從Foo以XML形式),并且適配器將返回票證(按照Foo所需的XML模式以XML文檔的形式)。

因此,測試這種交互作用,我需要做兩件事:

  • 確保使用特定參數調用logIn方法
  • 通過getTicket方法模擬有效票證的響應

而且,我還要驗證logIn失敗是否導致適配器代碼中發生特定的交互。 因此,我還需要模擬一些異常行為。

在模擬特定方法的情況下,您只需將幾個方法鏈接在一起即可。 在我的情況下, when and thenReturn可以像這樣進行操作:

模擬getTicket的行為

when(qtpThing.getTicket()).thenReturn("test-ticket");

在上面的代碼中,當在我的模擬實例上調用getTicket方法時,將返回String “ test-ticket”。

接下來,為了確保使用從傳入XML文檔獲得的參數調用logIn ,我可以使用Mockito的verify方法。

使用Mockito的驗證來確保正確的交互

verify(qtpThing, times(1)).logIn("some_value", "some_user_name", "password");

在這種情況下, verify方法將檢查一次logIn是否被調用,以及是否傳入了三個特定的String值。如果不滿足這些期望,Mockito將拋出異常(并且您相應的測試用例將失敗)。

因此,用于驗證適配器的測試用例非常簡單,但可讀性很高。

用于驗證登錄行為的JUnit測試用例

@Test public void testLoginRequest() throws Exception {QTP qtpThing = mock(QTP.class);when(qtpThing.getTicket()).thenReturn("test-ticket");AdapterRequest request = new AdapterRequest(XML.read("etc/test-login-req.xml"));QbosAdapter adapter = new QbosAdapter();adapter.setQtpInstance(qtpThing);AdapterResponse adapterResponse = adapter.performAction(request);assertNotNull(adapterResponse);verify(qtpThing, times(1)).logIn("some_value", "some_user_name", "password");assertEquals("test-ticket", adapterResponse.getData().getText()); }

如果我需要模擬QTP對象拋出的異常,表面QTP是由于登錄期間參數無效或憑證不正確怎么辦? 同樣,Mockito的流暢API使這一切變得輕而易舉。

就我而言,我希望logIn方法將其檢查過的方法之一拋出其名為UnknownQtpException方法簽名中。 您可以通過doThrow和when方法執行此操作。

模擬出Mockito中的異常

doThrow(new UnknownQtpException()).when(qtpThing).logIn("", "blah", "blah");

在上面的代碼中,我明確聲明,如果logIn命令的第一個參數為空,則UnknownQtpException QTP實例應拋出UnknownQtpException 。 將所有內容放在一起將產生以下測試用例:

使用JUnit和Mockito測試異常情況

@Test public void testFailureLoginRequest() throws Exception {QTP qtpThing = mock(QTP.class);doThrow(new UnknownQtpException()).when(qtpThing).logIn("", "blah", "blah");XML xml = XML.read("etc/test-login-req-err.xml");AdapterRequest request = new AdapterRequest(xml);QbosAdapter adapter = new QbosAdapter();adapter.setQtpInstance(qtpThing);AdapterResponse adapterResponse = adapter.performAction(request);assertNotNull(adapterResponse);verify(qtpThing, times(1)).logIn("", "blah", "blah");assertEquals("FAILURE", adapterResponse.getData().getText()); }

當然,其優點在于,我的測試用例無需依賴第三方系統(在本例中為Bar)即可有效地測試適配器代碼。 這自然是一種久經考驗的測試技術,可在任何語言中使用,值得一試的模擬框架!

如果您發現自己用Java編寫了一些集成代碼,那么我不推薦Mockito。 Mockito的API非常簡單,使測試易于理解。 我的意思是,它使測試易于吸收。 數字?

參考: The Disco Blog博客中的JCG合作伙伴 Andrew Glover 吸取了Mockito的流暢性 。

翻譯自: https://www.javacodegeeks.com/2013/08/imbibing-the-fluency-of-mockito.html

mockito

總結

以上是生活随笔為你收集整理的mockito_吸收Mockito的流利度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。