單元測試第四彈——使用Mock技術(shù)進(jìn)行單元測試
碰撞測試是汽車開發(fā)活動中的重要組成部分。所有汽車在上市之前都要經(jīng)過碰撞測試,并公布測試結(jié)果。碰撞測試的目的用于評定運(yùn)輸包裝件在運(yùn)輸過程中承受多次重復(fù)性機(jī)械碰撞的耐沖擊強(qiáng)度及包裝對內(nèi)裝物的保護(hù)能力。說簡單點(diǎn)就是為了測試汽車在碰撞的時候鎖所產(chǎn)生的自身損傷、對車內(nèi)人員及車外人員、物品等的損傷情況。
在進(jìn)行汽車的碰撞測試時,當(dāng)然不能讓真人來進(jìn)行測試,一般采用假人來測試。但是為了保證測試的真實(shí)性及可靠性,假人的生物力學(xué)性能應(yīng)該和人體一樣——比如身體各部分的大小和質(zhì)量,以及關(guān)節(jié)的剛性等等,只有這樣使用它們的模擬才能和現(xiàn)實(shí)相匹配。為了保證覆蓋到的情況夠全面,一般都會使用各種不同的假人,不同的假人模擬男性或者女性的身體,以及不同身高和年齡的人體。
想想軟件測試,其實(shí)和汽車的碰撞測試流程差不多。一個軟件在發(fā)布上線之前都要經(jīng)過各種測試,并產(chǎn)出測試報(bào)告,更嚴(yán)格的一點(diǎn)的要保證單測覆蓋率不能低于某個值。和汽車碰撞測試類似,我們在軟件測試中也會用到很多“假人”。用這些“假人”的目的也是為了保證測試有效的進(jìn)行。
why
不知道你在日常開發(fā)中有沒有遇到過以下問題或需求:
1、和別人一起做同一個項(xiàng)目,相互之間已經(jīng)約定好接口。然后你開始開發(fā),開發(fā)完自己的代碼后,你想測試下你的服務(wù)實(shí)現(xiàn)邏輯是否正確。但是因?yàn)槟阋蕾嚨闹皇墙涌冢嬲姆?wù)還有開發(fā)出來。
2、還是和上面類似的場景,你要依賴的服務(wù)是通過RPC的方式調(diào)用的,而外部服務(wù)的穩(wěn)定性很難保證。
3、對于一個接口或者方法,你希望測試其各種不同情況,但是依賴的服務(wù)的執(zhí)行策略及返回值你沒辦法決定。
4、你依賴的服務(wù)或者對象很難創(chuàng)建!(比如具體的web容器)
5、依賴的對象的某些行為很難觸發(fā)!(比如網(wǎng)絡(luò)異常)
6、以上問題你都沒有,但是你要用的那個服務(wù)他處理速度實(shí)在是太慢了。
上面這些情況都是日常開發(fā)測試過程中可能遇到的比較麻煩的問題。這些問題都會大大的提高測試成本。可以說,很多開發(fā)人員不愿意寫單元測試很大程度上都和以上這六點(diǎn)有關(guān)系。
幸運(yùn)的是,Mock對象可以解決以上問題。使用mock對象進(jìn)行的測試就是mock測試。
what
mock測試就是在測試過程中,對于某些不容易構(gòu)造或者不容易獲取的對象,用一個虛擬的對象來創(chuàng)建以便測試的測試方法。
mock對象,就是非真實(shí)對象,是模擬出來的一個對象。可以理解為汽車碰撞測試的那個假人。mock對象就是真實(shí)對象在調(diào)試期間的代替品。
你創(chuàng)建這樣一個“假人”的成本比較低,這個“假人”可以按照你設(shè)定的“劇情”來運(yùn)行。
在Java的單元測試中,很多Mock框架可以使用,用的比較多的有easymock、mockito、powermock、jmockit等。
面向?qū)ο箝_發(fā)中,我們通常定義一個接口,使用一個接口來描述這個對象。在被測試代碼中只是通過接口來引用對象,所以它不知道這個引用的對象是真實(shí)對象,還是mock對象。
好了,這篇文章的內(nèi)容差不多就這些了,主要是讓大家知道,在Java中可以使用mock對象來模擬真實(shí)對象來進(jìn)行單元測試,好處很多。下一篇會詳細(xì)介紹如何使用mockito框架進(jìn)行單元測試。
【本文是51CTO專欄作者Hollis的原創(chuàng)文章,作者微信公眾號Hollis(ID:hollischuang)】

























