使用Mockito進(jìn)行單元測試

一泰演、使用JUnit + Mockito進(jìn)行單元測試

Java中的Mock工具有很多,比如Mockito, jMock, EasyMock等,在這里我們只說下Mockito朝捆,因?yàn)槠渌奈乙矝]用過:-D
下面省去怎么引入mockito的步驟废亭,希望可以用不到1h的時間国章,讓大家可以使用Mockito寫出期望的單測。

二豆村、實(shí)戰(zhàn)mockito

mockito是一款開源的測試框架液兽,可以方便地通過mock(模擬)方式進(jìn)行測試驗(yàn)證。可以很方便地跟JUnit結(jié)合起來用四啰。為了更好地使用mockito宁玫,我們先來了解下mockito中的幾個核心概念。

2.1 mock

mock柑晒,就是偽造一個待測試的對象欧瘪,可以隨意擺布,讓它干啥就干啥匙赞。
mockito中佛掖,可以通過TestClass mockObject = mock(TestClass.class)來創(chuàng)建一個偽造的對象。
如果你調(diào)用mockObject中的方法涌庭,則什么事情都不會做芥被,如果對應(yīng)方法有返回值的話,那就返回返回類型在JAVA中的默認(rèn)值坐榆。比如如果方法的返回值類型是boolean則返回false拴魄,如果返回值類型是String則返回null, List返回[]等

2.2 stub樁

樁(Stub),就是把要調(diào)用的方法模擬掉猛拴,讓方法按照我們的期望行動羹铅。一般樁的目的,有三種

  1. doNothing : 啥也不做
  2. doReturn : 返回具體值
  3. doThrow: 拋出異常

對于doReturn愉昆,有兩種實(shí)現(xiàn)方法职员,

  1. when(mockObject.invokeMethod(...params)).thenReturn(...) : 會真正執(zhí)行invokeMethod內(nèi)的邏輯,只是返回值會為設(shè)定的返回值跛溉。
  2. doReturn(...).when(mockObject).invokeMethod(...params) : 不會真正執(zhí)行invokeMethod焊切,只返回設(shè)定值。

doThrow邏輯跟doReturn一樣芳室。

2.2 mock V.S. spy

我們在使用mockito過程中专肪,可以以mock的方式,也可以以spy的方式把實(shí)際的動作給mock掉堪侯。如

TestClass object = mock(TestClass.class); // mock
TestClass object = spy(TestClass.class); // spy

這兩種方式有什么區(qū)別呢? 簡而言之
mock就是對象是完完全全假的對象嚎尤,其中所有的方法都會以樁的方式來執(zhí)行。
spy伍宦,又稱部分mock芽死,如果設(shè)置了樁,則使用樁的返回值次洼;如果未設(shè)置樁关贵,則調(diào)用對象真實(shí)的方法

當(dāng)然你也可以指定mock對象具體方法的行為,在2.2節(jié)已經(jīng)講過卖毁。

2.3 使用mock class, 導(dǎo)致@Autowired的bean注入為Null

在spring的項(xiàng)目中揖曾,我們通常會在類中通過注解的方式注入對象,比如

public class PersonService {
    @Autowired
    private PersonDao personDao;
    
    public String getPersonName(Long id) {
        return personDao.getPersonName(id);
    }
}

如果你在mockito的單測中,直接寫PersonService personService = mock(PersonService.class); 那在真正執(zhí)行g(shù)etPersonName(id)這個時候炭剪,對于personDao這個對象练链,是null。
原因就是單測對象被Mock掉之后念祭,其中注入的對象spring是感知不到的兑宇。這個就跟我們自己通過new TestClass()方式無法注入@Autowired對象一個邏輯。

解決方案就是利用@InjectMocks 進(jìn)行注入粱坤,注意在單測跑之前需要調(diào)用MockitoAnnotations.initMocks(this);

具體可以參考: https://dzone.com/articles/use-mockito-mock-autowired

2.4 利用verify做驗(yàn)證

對于Mock的對象隶糕,由于我們就是為了把實(shí)際的操作給mock掉,那mockito怎么驗(yàn)證測試是否啟動成功? 在mockito中站玄,可以記錄每次調(diào)用的方法以及對應(yīng)的參數(shù)枚驻,之后用verify進(jìn)行驗(yàn)證。
比如株旷,verify(bar, times(1)).someMethod(); 來驗(yàn)證bar這個對象再登,調(diào)用了1次someMethod方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晾剖,一起剝皮案震驚了整個濱河市锉矢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌齿尽,老刑警劉巖沽损,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異循头,居然都是意外死亡绵估,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門卡骂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來国裳,“玉大人,你說我怎么就攤上這事全跨》熳螅” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵浓若,是天一觀的道長盒使。 經(jīng)常有香客問我,道長七嫌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任苞慢,我火速辦了婚禮诵原,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己绍赛,他們只是感情好蔓纠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吗蚌,像睡著了一般腿倚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚯妇,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天敷燎,我揣著相機(jī)與錄音,去河邊找鬼箩言。 笑死硬贯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陨收。 我是一名探鬼主播饭豹,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼务漩!你這毒婦竟也來了拄衰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤饵骨,失蹤者是張志新(化名)和其女友劉穎翘悉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宏悦,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镐确,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了饼煞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片源葫。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖砖瞧,靈堂內(nèi)的尸體忽然破棺而出息堂,到底是詐尸還是另有隱情,我是刑警寧澤块促,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布荣堰,位于F島的核電站,受9級特大地震影響竭翠,放射性物質(zhì)發(fā)生泄漏振坚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一斋扰、第九天 我趴在偏房一處隱蔽的房頂上張望渡八。 院中可真熱鬧啃洋,春花似錦、人聲如沸屎鳍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逮壁。三九已至孵坚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窥淆,已是汗流浹背卖宠。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祖乳,地道東北人逗堵。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像眷昆,于是被迫代替她去往敵國和親蜒秤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

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