Mockito 101
Mockito是一個模擬框架,可讓您使用簡潔的API編寫漂亮的測試。 它偏向于最低規(guī)格,使不同的行為看起來有所不同,并顯示清晰的錯誤消息。
創(chuàng)造嘲弄
要使用Mockito創(chuàng)建模擬,只需使用@Mock注釋模擬,然后調(diào)用MockitoAnnotations.initMocks(this) 。
存根值
存根值可以刺激現(xiàn)有代碼的行為,或臨時替代尚待開發(fā)的代碼。 默認情況下,對于所有返回值的方法,mock返回null,空集合或適當?shù)脑?原始包裝器值(例如:0,false,…)。 您可以按以下方式覆蓋存根值。 一旦存根,該方法將始終返回存根值,而不管它被調(diào)用了多少次。 對于具有無效返回值的方法,通常不需要將其存根。
import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; ... // a method that returns values when(mockFoo.someCall()).thenReturn(someValue); when(mockFoo.someCall()).thenThrow(new FooException()); // a method with a void return doThrow(new FooException()).when(mockFoo).voidMethodThatThrows();驗證方法是否被調(diào)用
// call the subject under test verify(mockFoo, times(2)).someCall(); verify(mockFoo).someCall(); verify(mockFoo).callWithVoidReturnType();“粗略”和“驗證”有什么區(qū)別? 簡而言之,對于您并不真正關心的項目,應使用“存根”,但它們必須通過測試。 相反,應使用“驗證”來驗證行為。
驗證單個對象的調(diào)用順序
InOrder order1 = Mockito.inOrder(mockFoo); order1.verify(mockFoo).firstCall(); order1.verify(mockFoo).thirdCall();InOrder order2 = Mockito.inOrder(mockFoo); order2.verify(mockFoo).secondCall(); order2.verify(mockFoo).fifthCall();驗證跨多個對象的調(diào)用順序
Foo mockFoo = Mockito.mock(Foo.class); Bar mockBar = Mockito.mock(Bar.class);// call the subject under test InOrder order = Mockito.inOrder(mockFoo, mockBar) order.verify(mockFoo).firstCall(); order.verify(mockBar).secondCall();驗證僅進行了預期的呼叫
通常,不再進行交互的測試應該很少。
// call the subject under test verify(mockFoo).expectedCall(); verify(mockFoo).someOtherExpectedCall(); verifyNoMoreInteractions(mockFoo);驗證未撥打特定電話
測試未發(fā)出特定呼叫通常比檢查“不再有呼叫”要好。
// call the subject under test verify(mockStream, never()).close();匹配器
當==和equals不能用于存根或驗證時,我們可以將匹配器用于模擬方法參數(shù)。 如果您發(fā)現(xiàn)需要復雜的匹配器,請考慮簡化您的測試對象或測試,或者考慮使用手工制作的假冒代替模擬。
import static org.mockito.Mockito.*;// Both of these forms use "equals" when(mockFoo.set("blah", 2)).thenReturn(value); when(mockFoo.set(eq("blah"), eq(2))).thenReturn(value);when(mockFoo.set(contains("la"), eq(2))).thenReturn(value); when(mockFoo.set(eq("blah"), anyInt())).thenReturn(value); when(mockFoo.set(anyObject(), eq(2))).thenReturn(value); when(mockFoo.set(isA(String.class), eq(2))).thenReturn(value); when(mockFoo.set(same(expected), eq(2))).thenReturn(value);ArgumentCaptor<String> sArg = ArgumentCaptor.forClass(String.class); when(mockFoo.set(sArg.capture(), eq(2))).thenReturn(value); ... // returns last captured value String capturedString = sArg.getValue(); List<String> capturedStrings = sArg.getAllValues();局部嘲弄
使用spy或CALLS_REAL_METHODS ,您可能希望使用不調(diào)用現(xiàn)有方法或存根的備用存根語法: doReturn("The spy has control.").when(mockFoo).aMethod() 。
import org.mockito.Mockito;Foo mockFoo = Mockito.spy(new Foo()); // Note: instance, not class. // Note: "when" calls the real method, see tip below. when(mockFoo.aMethod()).thenReturn("The spy has control."); // call the subject under test verify(mockFoo).aMethod(); // Verify a call to a real method was made. verify(mockFoo).someRealMethod(); // Alternative construct, that will fail if an unstubbed abstract // method is called. Foo mockFoo = Mockito.mock(Foo.class, Mockito.CALLS_REAL_METHODS);翻譯自: https://www.javacodegeeks.com/2014/09/mockito-101.html
總結
以上是生活随笔為你收集整理的Mockito 101的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rm在linux什么意思(linux
- 下一篇: 如何使用单例EJB和MBean构建和清除