成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Mockito 一個優秀的 Mock 測試框架

開發 架構
日常工作中很多時候我們都需要同事間的相互配合協作完成某些功能,所以我們經常會遇到服務或者應用內不同模塊之間要互相依賴的場景。

[[404363]]

本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲 。轉載本文請聯系Java極客技術公眾號。

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

我們通過使用 Mock 技術可以讓開發不停滯,Mock技術的作用是將服務與服務之間的依賴在測試自測階段隔離開,讓開發人員在自己的應用內部通過模擬的方式把需要依賴外部的接口給構造出來,從而保證不被外界的開發進度所影響。今天我們要談到的Mockito 就是一個優秀的 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 的可讀性非常好,不會讓你感動迷惑,產生的驗證錯誤也很明確。

官網地址:https://site.mockito.org/

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

測試用例 1

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

  1. <dependency> 
  2.   <groupId>org.mockito</groupId> 
  3.   <artifactId>mockito-all</artifactId> 
  4.   <version>1.9.5</version> 
  5.   <scope>test</scope> 
  6. </dependency> 
  7.  
  8. <dependency> 
  9.   <groupId>junit</groupId> 
  10.   <artifactId>junit</artifactId> 
  11.   <version>4.11</version> 
  12.   <scope>test</scope> 
  13. </dependency> 

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

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

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

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

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

  1. //精確次數 
  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

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

  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.   //驗證有沒有執行 get(0) 操作 
  13.   verify(mockedList).get(0); 

可以看到當我們調用 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); 

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

測試用例 3

日常開發中我們通過要保證方法的時效性,或者說我們要保證我們某個方法必須在多長時間內執行完成,這個時候我們也可以通過 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.         } 
  13.  
  14.         @Override 
  15.         public VerificationMode description(String s) { 
  16.           return null
  17.         } 
  18.       }; 
  19.       verify(mock, new Timeout(100, customVer)).getRequest(url); 

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

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2023-03-22 18:17:49

Python框架測試自動化

2011-04-13 11:38:09

Mockito

2022-07-11 06:43:21

測試框架Java

2023-07-26 07:10:28

Mockito注解@Mock

2009-05-20 09:49:15

2013-07-01 11:01:22

API設計API

2023-02-07 17:39:06

前端測試開發

2013-08-15 10:00:07

產品產品經理優秀的產品

2022-03-24 14:58:02

Java散列表編程語言

2022-03-14 10:02:03

散列表鏈表哈希表

2017-03-23 16:02:10

Mock技術單元測試

2017-09-07 19:21:20

Java語言Iodine

2023-10-26 12:10:54

2023-02-03 17:29:46

2021-02-09 00:28:59

WebCSS開源

2024-07-29 12:12:59

2018-06-11 17:06:44

WOTeBay茹炳晟

2015-07-28 11:02:15

androidapp開發

2009-07-02 09:42:34

JSP程序員

2011-06-13 20:44:06

SEO
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人午夜黄色 | 国产精品亚洲一区二区三区在线 | 色在线免费视频 | 亚洲精品视频在线看 | 亚洲巨乳自拍在线视频 | 国产精品亚洲一区 | 免费av直接看 | 全部免费毛片在线播放网站 | 国产一区二 | 日本免费在线看 | 999视频 | 国产成人精品一区二区 | 亚洲国产精品福利 | 成人精品影院 | 日韩91| 中文字幕综合在线 | 亚洲一区日韩 | a在线视频| 亚洲视频欧美视频 | 色接久久 | 一区二区亚洲 | 国产四区 | 精品99久久 | 精品视频在线播放 | 天天综合网永久 | 久久国产区 | 欧美久久久久久久 | www.日韩| 国产成人精品亚洲日本在线观看 | 欧美日韩不卡合集视频 | 亚洲精品久久久久久久久久久 | 亚洲va欧美va天堂v国产综合 | 久久久一区二区三区 | 国产精品一二区 | 久久国产成人 | 天天艹| 亚洲精久 | 欧美日韩精品区 | 欧美精品中文字幕久久二区 | a爱视频 | 欧美一区二区三区在线免费观看 |