日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Mockito一個優(yōu)秀的Mock測試框架

本文轉(zhuǎn)載自微信公眾號「Java極客技術(shù)」,作者鴨血粉絲 。轉(zhuǎn)載本文請聯(lián)系Java極客技術(shù)公眾號。

Hello 大家好,我是阿粉,日常工作中很多時候我們都需要同事間的相互配合協(xié)作完成某些功能,所以我們經(jīng)常會遇到服務或者應用內(nèi)不同模塊之間要互相依賴的場景。比如下面的場景,serviceA 中的 methodA() 方式依賴 serviceB 中的 methodB() 方法返回操作的結(jié)果。那如果我們要對自己的methodA() 方法進行編寫單元測試,還需要等其他同事的methodB() 方法開發(fā)完成才行。那有沒有什么辦法我們可以跳過或者說模擬方法 B 的輸出呢?這就引出了我們今天的主角 Mockito,一個優(yōu)秀的 Mock 測試框架。

我們通過使用 Mock 技術(shù)可以讓開發(fā)不停滯,Mock技術(shù)的作用是將服務與服務之間的依賴在測試自測階段隔離開,讓開發(fā)人員在自己的應用內(nèi)部通過模擬的方式把需要依賴外部的接口給構(gòu)造出來,從而保證不被外界的開發(fā)進度所影響。今天我們要談到的Mockito 就是一個優(yōu)秀的 Mock 框架。

Mockito

Mockito is a mocking framework that tastes really good. It lets you write beautiful tests with a clean & simple API. Mockito doesn’t give you hangover because the tests are very readable and they produce clean verification errors.

Mockito 是一個很好用的模擬框架。它讓您可以使用干凈簡單的 API 編寫漂亮的測試。Mockito 的可讀性非常好,不會讓你感動迷惑,產(chǎn)生的驗證錯誤也很明確。

官網(wǎng)地址:https://site.mockito.org/

中文文檔:https://github.com/hehonghui/mockito-doc-zh#0

測試用例 1

首先在工程的 pom 文件里面加依賴,我們加上 mockito 和junit 的依賴。

 
 
 
 
  1.   org.mockito
  2.   mockito-all
  3.   1.9.5
  4.   test
  5.   junit
  6.   junit
  7.   4.11
  8.   test

接下來我們編寫一個簡單的測試用例,這里我們通過mock 一個 List 對象,先添加幾個元素,后面驗證添加交互是否與我們預期的一致。

 
 
 
 
  1. @Test
  2. public void testVerify() throws Exception {
  3.   //創(chuàng)建 mock 對象
  4.   List mockedList = mock(List.class);
  5.   mockedList.add("test1");
  6.   mockedList.add("test2");
  7.   mockedList.add("test2");
  8.   mockedList.clear();
  9.   //驗證是否執(zhí)行了一次 add("test1") 操作
  10.   verify(mockedList).add("test1");
  11.   //同上面驗證是否執(zhí)行了一次 add("test1") 操作,默認就是 time(1)
  12.   verify(mockedList, times(1)).add("test1");
  13.   //驗證是否執(zhí)行了3次 add("test2") 操作
  14.   //verify(mockedList, times(3)).add("test2");
  15.   verify(mockedList).clear();
  16. }

上面的測試用例我們運行過后是如下效果,測試用例是通過的。

當我們放開verify(mockedList, times(3)).add("test2"); 這一行代碼進行運行時,我們可以看到測試用例未通過,提示的錯誤是我們預期執(zhí)行 3 次,結(jié)果實際只執(zhí)行了 2 次add("test2") 操作。

上面的測試用例是驗證對應方式的執(zhí)行次數(shù)是否和預期一致,除了有準確的次數(shù)之外,還有最多,至少,從未等驗證方式,如下所示:

 
 
 
 
  1. //精確次數(shù)
  2.  verify(mockedList, times(3)).add("test2");
  3.  //至少 1次
  4.  verify(mockedList, atLeastOnce()).add("test2");
  5.  //至少 2 次
  6.  verify(mockedList, atLeast(2)).add("test2");
  7.  //最多 5 次
  8.  verify(mockedList, atMost(5)).add("test2");

測試用例 2

通過設值或者打樁的方式預設參數(shù),如下所示,當執(zhí)行 get(0) 操作時,我們通過 thenReturn()方法返回 hello,當執(zhí)行 get(1)操作時我們拋出空指針異常,運行結(jié)果如下圖所示:

 
 
 
 
  1. @Test
  2. public void testWhen() throws Exception {
  3.   LinkedList mockedList = mock(LinkedList.class);
  4.   //設置值,通常被稱為打樁
  5.   when(mockedList.get(0)).thenReturn("hello");
  6.   when(mockedList.get(1)).thenThrow(new NullPointerException());
  7.   System.out.println(mockedList.get(0));
  8.   //這里會打印 "null" 因為 get(2) 沒有設置
  9.   System.out.println(mockedList.get(2));
  10.   //這里會拋 exception
  11.   System.out.println(mockedList.get(1));
  12.   //驗證有沒有執(zhí)行 get(0) 操作
  13.   verify(mockedList).get(0);
  14. }

可以看到當我們調(diào)用 get(0) 和 get(1) 的時候控制臺成功的拋出了異常。這種方式通常被稱為Stubbing,除了使用 when...thenReturn 方式之外,還有一種形式可以表達,代碼如下:

 
 
 
 
  1. @Test
  2. public void testDoReturn() throws Exception {
  3.   Iterator mockedList = mock(Iterator.class);
  4.   doReturn("hello").when(mockedList).next();
  5.   Object next = mockedList.next();
  6.   System.out.println(next);
  7.   doReturn("world").when(mockedList).next();
  8.   Object next2 = mockedList.next();
  9.   System.out.println(next2);
  10.   //上面的過程也可以寫成如下方式
  11.   doReturn("test1", "test2").when(mockedList).next();
  12.   Object next3 = mockedList.next();
  13.   System.out.println(next3);
  14.   Object next4 = mockedList.next();
  15.   System.out.println(next4);
  16. }

運行結(jié)果如下所示,也可以用 doThrow() 方法進行拋異常:

測試用例 3

日常開發(fā)中我們通過要保證方法的時效性,或者說我們要保證我們某個方法必須在多長時間內(nèi)執(zhí)行完成,這個時候我們也可以通過 mock 的方式來驗證我們的方法是否滿足要求。代碼如下:

 
 
 
 
  1. @Test
  2. public void testTimeout() throws Exception {
  3.       HttpService mock = mock(HttpService.class);
  4.       String url = "http://www.xxx.com";
  5.       mock.getRequest(url);
  6.       verify(mock, timeout(100)).getRequest(url);
  7.       //timeout時間后,用自定義的檢驗模式驗證getRequest()
  8.       VerificationMode customVer = new VerificationMode() {
  9.         @Override
  10.         public void verify(VerificationData data) {
  11.         }
  12.         @Override
  13.         public VerificationMode description(String s) {
  14.           return null;
  15.         }
  16.       };
  17.       verify(mock, new Timeout(100, customVer)).getRequest(url);
  18. }

Mockito 還有很多 API 可以使用,更多的使用方式,大家可以參考這面這個網(wǎng)站。https://www.tutorialspoint.com/mockito/mockito_timeouts.htm,有更詳細的介紹。


分享文章:Mockito一個優(yōu)秀的Mock測試框架
本文URL:http://m.5511xx.com/article/djoojsj.html