5分鐘了解Mockito(轉(zhuǎn)載)

一、什么是mock測試崖疤,什么是mock對象猪杭?


先來看看下面這個示例:

從上圖可以看出如果我們要對A進(jìn)行測試,那么就要先把整個依賴樹構(gòu)建出來搂赋,也就是BCDE的實(shí)例。


一種替代方案就是使用mocks

從圖中可以清晰的看出

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

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

知道什么是mock測試后幅慌,那么我們就來認(rèn)識一下mock框架---Mockito


二宋欺、什么是Mockito

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


三宿刮、Stub和Mock

相同點(diǎn):Stub和Mock對象都是用來模擬外部依賴,使我們能控制私蕾。

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


四揉抵、mockito入門實(shí)例

Maven依賴:(沒用maven管理的直接忽略)


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); ??


????????//設(shè)置方法的預(yù)期返回值???

????????when(list.get(0)).thenReturn("helloworld"); ??


????????String?result?=?list.get(0); ??


????????//驗(yàn)證方法調(diào)用(是否調(diào)用了get(0))???

????????verify(list).get(0); ??


????????//junit測試???

????????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");//anyString()替換成"hello"就會報(bào)錯???

????map.put(1,?"world"); ??

????verify(map).put(eq(1),?eq("world"));?//eq("world")替換成"world"也會報(bào)錯???


} ??


?六看峻、方法調(diào)用的驗(yàn)證(具體的調(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"); ??


?????/**?

*?基本的驗(yàn)證方法?

*?verify方法驗(yàn)證mock對象是否有沒有調(diào)用mockedList.add("once")方法?

*?不關(guān)心其是否有返回值互妓,如果沒有調(diào)用測試失敗。?

??????*/??

?????verify(mockedList).add("once");? ??

?????verify(mockedList,?times(1)).add("once");//默認(rèn)調(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灼狰,一起剝皮案震驚了整個濱河市惜浅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伏嗜,老刑警劉巖坛悉,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異承绸,居然都是意外死亡裸影,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門军熏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轩猩,“玉大人,你說我怎么就攤上這事荡澎【” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵摩幔,是天一觀的道長彤委。 經(jīng)常有香客問我,道長或衡,這世上最難降的妖魔是什么焦影? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮封断,結(jié)果婚禮上斯辰,老公的妹妹穿的比我還像新娘。我一直安慰自己坡疼,他們只是感情好彬呻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柄瑰,像睡著了一般闸氮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狱意,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天湖苞,我揣著相機(jī)與錄音,去河邊找鬼详囤。 笑死财骨,一個胖子當(dāng)著我的面吹牛镐作,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隆箩,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼该贾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捌臊?” 一聲冷哼從身側(cè)響起杨蛋,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎理澎,沒想到半個月后逞力,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡糠爬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年寇荧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片执隧。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡揩抡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镀琉,到底是詐尸還是另有隱情峦嗤,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布屋摔,位于F島的核電站烁设,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凡壤。R本人自食惡果不足惜署尤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一耙替、第九天 我趴在偏房一處隱蔽的房頂上張望亚侠。 院中可真熱鬧,春花似錦俗扇、人聲如沸硝烂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滞谢。三九已至,卻和暖如春除抛,著一層夾襖步出監(jiān)牢的瞬間狮杨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工到忽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留橄教,地道東北人清寇。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像护蝶,于是被迫代替她去往敵國和親华烟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. 預(yù)備知識 如果需要往下學(xué)習(xí)持灰,你需要先理解 Junit 框架中的單元測試盔夜。 如果你不熟悉 JUnit,請查看下...
    會飛的大象_閱讀 2,697評論 0 4
  • Mockito簡介什么是mock堤魁?在軟件開發(fā)的世界之外, "mock"一詞是指模仿或者效仿喂链。 因此可以將“mock...
    燕京博士閱讀 3,548評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)妥泉,斷路器衩藤,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 在博客Android單元測試之JUnit4中,我們簡單地介紹了:什么是單元測試涛漂,為什么要用單元測試赏表,并展示了一個簡...
    水木飛雪閱讀 9,447評論 4 18
  • 十月讀書打卡第一次,讀的是《假如給我三天光明》匈仗。大概內(nèi)容是講是作者在失去光明的時候做很多事情不方便瓢剿,如果有了光明,...
    盛聿洺閱讀 176評論 0 1