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