mockito讀書(shū)筆記

1、模擬拋出異常

dothrow(newRuntimeException()).when(mocklist).clear();

2、驗(yàn)證調(diào)用順序

InOrder inorder = inorder(list);

inorder.verify(list).add("hyt");

inOrder.verifyNoInteractions();//驗(yàn)證list在調(diào)用add("hyt")之后有沒(méi)有別的調(diào)用

inorder.verify(list).add("huangyt")

驗(yàn)證list調(diào)用add("hyt")在add("huangyt")之前被調(diào)用

3、確認(rèn)方法從來(lái)沒(méi)被調(diào)用

verify(mockone,never()).add("two");

4、驗(yàn)證多余的方法

verifyNoMoreInteraction(list);

如果list被模擬出來(lái)并且有方法沒(méi)有被驗(yàn)證,則該驗(yàn)證成功,否則失敗。

5、@mock注解的方式模擬一個(gè)對(duì)象值

注意:該注解在基類(lèi)或者一個(gè)測(cè)試的啟動(dòng)類(lèi)里加入:

MockitoAnnotations.initMocks(test);

解決辦法:可以在測(cè)試類(lèi)上加入MockitoJunitRunner ,eg:@RunWith(MockitoJUnitRunner.class)

也可以在加一個(gè)規(guī)則 eg:

@Rule public MockitoRule rule = MockitoJUnit.rule();

6、樁的連續(xù)調(diào)用:當(dāng)同一個(gè)方法順序調(diào)用時(shí)返回的值不一樣時(shí),可以使用連續(xù)調(diào)用

eg:when(mock.someMethod("some arg")) .thenThrow(new RuntimeException()) .thenReturn("foo");

eg:when(mock.someMethod("some arg")) .thenReturn("one", "two", "three");

7、mock對(duì)象的創(chuàng)建:

1、mock(class classToMock)

2、mock(class classToMock,String name)//name是mock對(duì)象的名字,這樣的好處是測(cè)試失敗時(shí)會(huì)將mock的對(duì)象打印出來(lái),對(duì)于final、匿名類(lèi)、java基本類(lèi)型無(wú)法mock

8、對(duì)于方法調(diào)用為空的方法:

一般使用:doNothing().when(List).remove();

or doNothing().doThrow(new RuntimeException()).when(List).remove();

9、查詢(xún)沒(méi)有交互的mock對(duì)象

verifyzeroInteractions(),

10、驗(yàn)證對(duì)象方法的調(diào)用次數(shù):

never()沒(méi)有被調(diào)用過(guò),和times(0)相同

atLeast(N)至少被調(diào)用N次

atLeastOnce()相當(dāng)于atLeast(1)

atMost(N)最多被調(diào)用N次

eg:verify(list,atMost(1)).add(1);

11、mock對(duì)象的重置:

reset(list)//重置之后,mock對(duì)象將回到最初被 創(chuàng)建的狀態(tài),沒(méi)有任何stubbing和方法調(diào)用

12、answer接口(方法預(yù)期回調(diào)接口)

需要自定義方法執(zhí)行返回結(jié)果,其中invocationOnMock對(duì)象

13、RETURNS_SMART_NULLS

創(chuàng)建一個(gè)mock對(duì)象,如果調(diào)用為stubbing的方法是不會(huì)報(bào)錯(cuò),而是返回相應(yīng)的數(shù)據(jù):

eg:List mock = mock(List.class, RETURNS_SMART_NULLS);

System.out.println(mock.get(0));//此時(shí)會(huì)返回list.get(0)

System.out.println(mock.toArray().length);//此時(shí)返回0

14、RETURNS_DEEP_STUBS

假如Account對(duì)象有一個(gè)屬性是RailwayTicket,如果mock一個(gè)Account對(duì)象時(shí)使用RETURNS_DEEP_STUBS參數(shù)時(shí),系統(tǒng)會(huì)自動(dòng)mock一個(gè)RailwayTicket對(duì)象,如果沒(méi)使用改參數(shù),將會(huì)報(bào)空指針異常

注意:如果鏈中包含任何原始類(lèi)或者最終類(lèi)時(shí),該功能將不起作用。

eg:

Account account = mock(Account.class,RETURNS_DEEP_STUBS);

when(account.getRailwayTicket().getDestination()).thenReturn("hangzhou");

account.getRailwayTicket().getDestination();

verify(account.getRailwayTicket(),atLeast(1)).getDe

15、mock反射

一個(gè)接口方法中調(diào)用了N個(gè)上下游服務(wù),需要將其中的一個(gè)服務(wù)mock掉,其余服務(wù)按實(shí)際業(yè)務(wù)調(diào)用

eg:

BidService bidService = Mockito.mock(BidService.class);

when(bidService.packageBidSynchronization(any())).thenReturn(response);

try{

? ? ? ?ReflectionTestUtils.setField(bidInfoBiz,"bidService",bidService);

}catch(Exception e) {

e.printStackTrace();

}

16、doCallRealMethod()

若一個(gè)接口有N個(gè)方法,某個(gè)方法期望返回期望結(jié)果,別的方法按實(shí)際調(diào)用邏輯執(zhí)行

DepositRepurchaseDebtInvoker depositRepurchaseDebtInvoker =mock(DepositRepurchaseDebtInvokerImpl.class);//被mock的類(lèi)

when(depositRepurchaseDebtInvoker.check(any())).thenCallRealMethod();//按實(shí)際業(yè)務(wù)調(diào)用的類(lèi),返回有返回值

Mockito.doCallRealMethod().when(depositRepurchaseDebtInvoker).save(any(),any());//按實(shí)際業(yè)務(wù)調(diào)用的類(lèi),方法無(wú)返回值

Mockito.doCallRealMethod().when(depositRepurchaseDebtInvoker).finish(any());//mock返回固定值的方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容