吸收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調用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非常簡單,它使測試易于理解。 我的意思是,它使測試易于吸收。 數字?
翻譯自: https://www.javacodegeeks.com/2013/08/imbibing-the-fluency-of-mockito.html
總結
以上是生活随笔為你收集整理的吸收Mockito的流利度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Spring长轮询Tomcat
- 下一篇: 有存钱计划的APP吗?