Mockito簡(jiǎn)介和示例
Mockito也是一個(gè)開源的mock工具包错英,和EasyMock不同的時(shí),它不需要錄制赊瞬、播放這些動(dòng)作先煎,語(yǔ)法上更靈活,可讀性更強(qiáng)
官網(wǎng):mockito
官方文檔:mockito.html
范例代碼
1.maven工程的話巧涧,首先引入pom包:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.7.12</version>
<scope>test</scope>
</dependency>
2.測(cè)試類中引入靜態(tài)資源:
import static org.mockito.Mockito.*;
3.支持以下特性:(源碼來(lái)自官方文檔)
- 驗(yàn)證行為有沒有被調(diào)用過(guò)
//create mock
List mockedList = mock(List.class);
//use mock object
mockedList.add("one");
mockedList.clear();
//驗(yàn)證add方法是否在前面被調(diào)用了一次薯蝎,且參數(shù)為“one”。clear方法同樣谤绳。
verify(mockedList).add("one");
verify(mockedList).clear();
//下面的驗(yàn)證會(huì)失敗占锯。因?yàn)闆]有調(diào)用過(guò)add("two")。
verify(mockedList).add("two");
- 插樁:使mock對(duì)象的方法返回期望值
對(duì)于沒有stub過(guò)的有返回值的方法缩筛,會(huì)返回默認(rèn)值(0消略,false,null等)
//stubbing瞎抛。當(dāng)get(0)被調(diào)用時(shí)艺演,返回"first". 方法get(1)被調(diào)用時(shí),拋異常桐臊。
when(mockedList.get(0)).thenReturn("first");
when(mockedList.get(1)).thenThrow(new RuntimeException());
重復(fù)stub
//重復(fù)stub胎撤,以最后一次為準(zhǔn),如下將返回"second":
when(mockedList.get(0)).thenReturn("first");
when(mockedList.get(0)).thenReturn("second");
//如下表示第一次調(diào)用時(shí)返回“first”断凶,第二次調(diào)用時(shí)返回“second”伤提。可以寫n個(gè)认烁。
when(mockedList.get(0)).thenReturn("first").thenReturn("second");
如果實(shí)際調(diào)用的次數(shù)超過(guò)了stub過(guò)的次數(shù)肿男,則返回最后一次stub的值介汹。
例如第三次調(diào)用get(0)時(shí),則會(huì)返回"second".
- 參數(shù)匹配
如果想實(shí)現(xiàn)get(任意整數(shù))時(shí)舶沛,都返回null痴昧,如何做?
when(mockedlist.get(anyInt())).thenReturn(null);
有許多的arguments matcher冠王,參考More ArgumentMatchers
Argument matcher支持定制
- 驗(yàn)證方法被調(diào)用了特定次數(shù)/至少x次/最多x次/從未被調(diào)用
//是否add("twice")被調(diào)用了兩次。
verify(mockedList, times(2)).add("twice");
//驗(yàn)證add("twice")被調(diào)用了至少一次舌镶。以及其他柱彻。
verify(mockedList, atLeastOnce()).add("twice");
verify(mockedList, atLeast(2)).add("twice");
verify(mockedList, atMost(5)).add("twice");
verify(mockedList, never()).add("twice");
- 調(diào)用方法時(shí)拋出異常
doThrow(new RuntimeException()).when(mockedList).clear();
- 驗(yàn)證順序
一個(gè)mock對(duì)象的方法以特定順序被調(diào)用多次
多個(gè)mock對(duì)象以特定順序被調(diào)用多次
inOrder.verify(firstMock).add("was called first");
inOrder.verify(secondMock).add("was called second");
其中,插樁(stubbing)mock對(duì)象的返回值是測(cè)試中最常用到的