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返回固定值的方法