mockito_吸收Mockito的流利度
mockito
我最近發(fā)現(xiàn)自己編寫了一些代碼來集成兩個不同的平臺。 這些系統(tǒng)之一是基于Java的系統(tǒng),而另一個雖然不是用Java編寫的,卻提供了Java API。 我將這些系統(tǒng)分別稱為Foo和Bar。
在我編寫一行代碼之前就很明顯了,但是,測試最終的適配器將需要我顯式地模擬后來的系統(tǒng)的API(即Foo),因為我所需要的只是一個jar文件,其類和方法清楚了他們與一個實例進行了交流。
我花了幾個周期來查看Java 模擬世界中的新功能,并且很高興看到我的老朋友Mockito仍然很活躍,并且確實仍然是通用模擬的出色工具 。 對于初學(xué)者來說, Mockito是基于Java的模擬框架,它可以:
…味道真的很好。 它使您可以使用[a]簡潔的API編寫漂亮的測試。 Mockito不會給您帶來麻煩,因為測試的可讀性很強,并且會產(chǎn)生清晰的驗證錯誤。
Google代碼模擬項目頁面 –為什么喝呢?
實際上,Mockito提供了一個簡單,流暢的API ,使您可以精確地模擬行為而無需大驚小怪。 例如,與Bar進行交互的主要外觀是通過QTP類,該類具有諸如logIn , logOut等方法。與其依靠被測類實際調(diào)用這些方法,我還可以像這樣輕松地使用Mockito創(chuàng)建QTP模擬實例。 :
模擬QTP實例
QTP qtpThing = mock(QTP.class);其中, mock是從org.mockito.Mockito靜態(tài)導(dǎo)入的方法。 使用模擬實例,然后我可以指示希望某些方法的行為, 只要我將此模擬實例傳遞給受測類即可 。
例如,方法logIn不返回任何內(nèi)容。 實際上,必須先調(diào)用該方法,然后再調(diào)用另一種方法以生成票證(或令牌),該票證將在后續(xù)方法調(diào)用中使用。 因此,我正在編寫的適配器將接收一些輸入值(從Foo以XML形式),并且適配器將返回票證(按照Foo所需的XML模式以XML文檔的形式)。
因此,測試這種交互作用,我需要做兩件事:
- 確保使用特定參數(shù)調(diào)用logIn方法
- 通過getTicket方法模擬有效票證的響應(yīng)
而且,我還要驗證logIn失敗是否導(dǎo)致適配器代碼中發(fā)生特定的交互。 因此,我還需要模擬一些異常行為。
在模擬特定方法的情況下,您只需將幾個方法鏈接在一起即可。 在我的情況下, when and thenReturn可以像這樣進行操作:
模擬getTicket的行為
when(qtpThing.getTicket()).thenReturn("test-ticket");在上面的代碼中,當(dāng)在我的模擬實例上調(diào)用getTicket方法時,將返回String “ test-ticket”。
接下來,為了確保使用從傳入XML文檔獲得的參數(shù)調(diào)用logIn ,我可以使用Mockito的verify方法。
使用Mockito的驗證來確保正確的交互
verify(qtpThing, times(1)).logIn("some_value", "some_user_name", "password");在這種情況下, verify方法將檢查一次logIn是否被調(diào)用,以及是否傳入了三個特定的String值。如果不滿足這些期望,Mockito將拋出異常(并且您相應(yīng)的測試用例將失敗)。
因此,用于驗證適配器的測試用例非常簡單,但可讀性很高。
用于驗證登錄行為的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是由于登錄期間參數(shù)無效或憑證不正確怎么辦? 同樣,Mockito的流暢API使這一切變得輕而易舉。
就我而言,我希望logIn方法將其檢查過的方法之一拋出其名為UnknownQtpException方法簽名中。 您可以通過doThrow和when方法執(zhí)行此操作。
模擬出Mockito中的異常
doThrow(new UnknownQtpException()).when(qtpThing).logIn("", "blah", "blah");在上面的代碼中,我明確聲明,如果logIn命令的第一個參數(shù)為空,則UnknownQtpException QTP實例應(yīng)拋出UnknownQtpException 。 將所有內(nèi)容放在一起將產(chǎn)生以下測試用例:
使用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()); }當(dāng)然,其優(yōu)點在于,我的測試用例無需依賴第三方系統(tǒng)(在本例中為Bar)即可有效地測試適配器代碼。 這自然是一種久經(jīng)考驗的測試技術(shù),可在任何語言中使用,值得一試的模擬框架!
如果您發(fā)現(xiàn)自己用Java編寫了一些集成代碼,那么我不推薦Mockito。 Mockito的API非常簡單,使測試易于理解。 我的意思是,它使測試易于吸收。 數(shù)字?
翻譯自: https://www.javacodegeeks.com/2013/08/imbibing-the-fluency-of-mockito.html
mockito
總結(jié)
以上是生活随笔為你收集整理的mockito_吸收Mockito的流利度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创新设计模式:抽象工厂模式
- 下一篇: 人间百态是啥意思 人间百态意思简述