生活随笔
收集整理的這篇文章主要介紹了
5分钟了解Mockito
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原文鏈接:http://liuzhijun.iteye.com/blog/1512780
?
一、什么是mock測試,什么是mock對象?
?
先來看看下面這個示例:
從上圖可以看出如果我們要對A進(jìn)行測試,那么就要先把整個依賴樹構(gòu)建出來,也就是BCDE的實例。
?
一種替代方案就是使用mocks
從圖中可以清晰的看出
mock對象就是在調(diào)試期間用來作為真實對象的替代品。
mock測試就是在測試過程中,對那些不容易構(gòu)建的對象用一個虛擬對象來代替測試的方法就叫mock測試。
知道什么是mock測試后,那么我們就來認(rèn)識一下mock框架---Mockito
?
二、什么是Mockito
除了有一個好記的名字外,Mockito嘗試用不一樣的方法做mocking測試,是簡單輕量級能夠替代EasyMock的框架。使用簡單,測試代碼可讀性高,豐富的文檔包含在javadoc中,直接在IDE中可查看文檔,實例,說明。更多信息:http://code.google.com/p/mockito/
?
三、Stub和Mock
相同點(diǎn):Stub和Mock對象都是用來模擬外部依賴,使我們能控制。
不同點(diǎn):而stub完全是模擬一個外部依賴,用來提供測試時所需要的測試數(shù)據(jù)。而mock對象用來判斷測試是否能通過,也就是用來驗證測試中依賴對象間的交互能否達(dá)到預(yù)期。在mocking框架中mock對象可以同時作為stub和mock對象使用,兩者并沒有嚴(yán)格區(qū)別。 更多信息:http://martinfowler.com/articles/mocksArentStubs.html
?
四、mockito入門實例
Maven依賴:(沒用maven管理的可以下載相關(guān)jar包導(dǎo)入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;????public?class?SimpleTest?{????????????????@Test??????public?void?simpleTest(){????????????????????????????List<String>?list?=?mock(List.class);????????????????????????????when(list.get(0)).thenReturn("helloworld");????????????????String?result?=?list.get(0);????????????????????????????verify(list).get(0);????????????????????????????Assert.assertEquals("helloworld",?result);??????}??}?? 好了,五分鐘差不多了,還想繼續(xù)了解那就可以往下面看
?
創(chuàng)建mock對象不能對final,Anonymous ,primitive類進(jìn)行mock。
?
可對方法設(shè)定返回異常
?
Java代碼??
when(list.get(1)).thenThrow(new?RuntimeException("test?excpetion"));?? ?
stubbing另一種語法(設(shè)置預(yù)期值的方法),可讀性不如前者
Java代碼??
doReturn("secondhello").when(list).get(1);?? 沒有返回值的void方法與其設(shè)定(支持迭代風(fēng)格,第一次調(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");????map.put(1,?"world");??????verify(map).put(eq(1),?eq("world"));???????}?? ?
?六、方法調(diào)用的驗證(具體的調(diào)用次數(shù)、至少一次,一次也沒有)
?
Java代碼??
@Test??public?void?verifyInvocate(){????????????List<String>?mockedList?=?mock(List.class);???????????mockedList.add("once");???????mockedList.add("twice");???????mockedList.add("twice");??????????????mockedList.add("three?times");???????mockedList.add("three?times");???????mockedList.add("three?times");???????????????????verify(mockedList).add("once");????????verify(mockedList,?times(1)).add("once");???????????????????verify(mockedList,?times(2)).add("twice");???????verify(mockedList,?times(3)).add("three?times");???????????????????verify(mockedList,?times(0)).add("never?happened");???????????????????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
轉(zhuǎn)載于:https://www.cnblogs.com/ieayoio/p/5691687.html
總結(jié)
以上是生活随笔為你收集整理的5分钟了解Mockito的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。