日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

5分钟了解Mockito

發(fā)布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5分钟了解Mockito 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文鏈接:http://liuzhijun.iteye.com/blog/1512780

?

一、什么是mock測試,什么是mock對象?

?

先來看看下面這個示例:

從上圖可以看出如果我們要對A進行測試,那么就要先把整個依賴樹構建出來,也就是BCDE的實例。

?

一種替代方案就是使用mocks

從圖中可以清晰的看出

mock對象就是在調(diào)試期間用來作為真實對象的替代品。

mock測試就是在測試過程中,對那些不容易構建的對象用一個虛擬對象來代替測試的方法就叫mock測試。

知道什么是mock測試后,那么我們就來認識一下mock框架---Mockito

?

二、什么是Mockito

除了有一個好記的名字外,Mockito嘗試用不一樣的方法做mocking測試,是簡單輕量級能夠替代EasyMock的框架。使用簡單,測試代碼可讀性高,豐富的文檔包含在javadoc中,直接在IDE中可查看文檔,實例,說明。更多信息:http://code.google.com/p/mockito/

?

三、Stub和Mock

相同點:Stub和Mock對象都是用來模擬外部依賴,使我們能控制。

不同點:而stub完全是模擬一個外部依賴,用來提供測試時所需要的測試數(shù)據(jù)。而mock對象用來判斷測試是否能通過,也就是用來驗證測試中依賴對象間的交互能否達到預期。在mocking框架中mock對象可以同時作為stub和mock對象使用,兩者并沒有嚴格區(qū)別。 更多信息:http://martinfowler.com/articles/mocksArentStubs.html

?

四、mockito入門實例

Maven依賴:(沒用maven管理的可以下載相關jar包導入classpath)

?

Xml代碼??
  • <dependencies>????
  • <dependency>????
  • <groupId>org.mockito</groupId>????
  • <artifactId>mockito-all</artifactId>????
  • <version>1.8.5</version>????
  • <scope>test</scope>????
  • </dependency>????
  • </dependencies>??
  • ?

    Java代碼??
  • import?static?org.mockito.Mockito.*;??
  • ??
  • import?java.util.List;??
  • ??
  • import?org.junit.Assert;??
  • import?org.junit.Test;??
  • ??
  • /**?
  • ?*??
  • ?*?@author?lzjun?
  • ?*?@version?0.1?
  • ?*?@date?2012-5-5?
  • ?*?{@link?http://weibo.com/u/1697702241}??
  • ?*?
  • ?*/??
  • public?class?SimpleTest?{??
  • ??????????
  • ????@Test??
  • ????public?void?simpleTest(){??
  • ??????????
  • ????????//創(chuàng)建mock對象,參數(shù)可以是類,也可以是接口??
  • ????????List<String>?list?=?mock(List.class);??
  • ??????????
  • ????????//設置方法的預期返回值??
  • ????????when(list.get(0)).thenReturn("helloworld");??
  • ??????
  • ????????String?result?=?list.get(0);??
  • ??????????
  • ????????//驗證方法調(diào)用(是否調(diào)用了get(0))??
  • ????????verify(list).get(0);??
  • ??????????
  • ????????//junit測試??
  • ????????Assert.assertEquals("helloworld",?result);??
  • ????}??
  • }??
  • 好了,五分鐘差不多了,還想繼續(xù)了解那就可以往下面看

    ?

    創(chuàng)建mock對象不能對final,Anonymous ,primitive類進行mock。

    ?

    可對方法設定返回異常

    ?

    Java代碼??
  • when(list.get(1)).thenThrow(new?RuntimeException("test?excpetion"));??
  • ?

    stubbing另一種語法(設置預期值的方法),可讀性不如前者

    Java代碼??
  • doReturn("secondhello").when(list).get(1);??
  • 沒有返回值的void方法與其設定(支持迭代風格,第一次調(diào)用donothing,第二次dothrow拋出runtime異常)

    Java代碼??
  • doNothing().doThrow(new?RuntimeException("void?exception")).when(list).clear();??
  • list.clear();??
  • list.clear();??
  • verify(list,times(2)).clear();??
  • ?

    五、參數(shù)匹配器(Argument Matcher)

    Matchers類內(nèi)加你有很多參數(shù)匹配器 ?anyInt、anyString、anyMap.....Mockito類繼承于Matchers,Stubbing時使用內(nèi)建參數(shù)匹配器,下例:

    ?

    Java代碼??
  • @Test??
  • public?void?argumentMatcherTest(){??
  • ??????
  • ????List<String>?list?=?mock(List.class);??
  • ??????
  • ????when(list.get(anyInt())).thenReturn("hello","world");??
  • ??????
  • ????String?result?=?list.get(0)+list.get(1);??
  • ??????
  • ????verify(list,times(2)).get(anyInt());??
  • ??????
  • ????Assert.assertEquals("helloworld",?result);??
  • ??????
  • }??
  • ?

    ?需要注意的是:如果使用參數(shù)匹配器,那么所有的參數(shù)都要使用參數(shù)匹配器,不管是stubbing還是verify的時候都一樣。

    ?

    Java代碼??
  • @Test??
  • public?void?argumentMatcherTest2(){??
  • ??????
  • ????Map<Integer,String>?map?=?mock(Map.class);??
  • ????when(map.put(anyInt(),anyString())).thenReturn("hello");//anyString()替換成"hello"就會報錯??
  • ????map.put(1,?"world");??
  • ????verify(map).put(eq(1),?eq("world"));?//eq("world")替換成"world"也會報錯??
  • ??????
  • }??
  • ?

    ?六、方法調(diào)用的驗證(具體的調(diào)用次數(shù)、至少一次,一次也沒有)

    ?

    Java代碼??
  • @Test??
  • public?void?verifyInvocate(){??
  • ??????
  • ????List<String>?mockedList?=?mock(List.class);??
  • ????//using?mock???
  • ?????mockedList.add("once");??
  • ?????mockedList.add("twice");??
  • ?????mockedList.add("twice");??
  • ???????
  • ?????mockedList.add("three?times");??
  • ?????mockedList.add("three?times");??
  • ?????mockedList.add("three?times");??
  • ???????
  • ?????/**?
  • ??????*?基本的驗證方法?
  • ??????*?verify方法驗證mock對象是否有沒有調(diào)用mockedList.add("once")方法?
  • ??????*?不關心其是否有返回值,如果沒有調(diào)用測試失敗。?
  • ??????*/??
  • ?????verify(mockedList).add("once");???
  • ?????verify(mockedList,?times(1)).add("once");//默認調(diào)用一次,times(1)可以省略??
  • ???????
  • ???????
  • ?????verify(mockedList,?times(2)).add("twice");??
  • ?????verify(mockedList,?times(3)).add("three?times");??
  • ???????
  • ?????//never()等同于time(0),一次也沒有調(diào)用??
  • ?????verify(mockedList,?times(0)).add("never?happened");??
  • ???????
  • ?????//atLeastOnece/atLeast()/atMost()??
  • ?????verify(mockedList,?atLeastOnce()).add("three?times");??
  • ?????verify(mockedList,?atLeast(2)).add("twice");??
  • ?????verify(mockedList,?atMost(5)).add("three?times");??
  • ??
  • }??
  • ?

    ?

    一次寫不完,慢慢分析。。。

    參考:

    http://mockito.googlecode.com/svn/branches/1.6/javadoc/org/mockito/Mockito.html

    http://www.sizovpoint.com/2009/03/java-mock-frameworks-comparison.html

    http://wenku.baidu.com/view/8def451a227916888486d73f.html

    http://qiuguo0205.iteye.com/blog/1443344

    轉載于:https://www.cnblogs.com/ieayoio/p/5691687.html

    總結

    以上是生活随笔為你收集整理的5分钟了解Mockito的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。