單元測試之如何破除外部依賴

一個外部依賴項是系統(tǒng)中的一個對象秉颗,被測試代碼與這個對象發(fā)生交互痢毒,但不能控制這個對象(不能控制這個對象返回值;不能控制這個對象的具體行為蚕甥;對象還未實現(xiàn))哪替。常見的依賴包括系統(tǒng)時間、Web服務(wù)菇怀、文件系統(tǒng)凭舶、數(shù)據(jù)庫服務(wù)晌块、內(nèi)存等。如何破除這些外部依賴帅霜,如何與他們進(jìn)行交互測試就是本篇文章討論的主要內(nèi)容匆背。

使用Stub破除依賴

Stub可以看做是一個依賴項的 ** 可控制 **的替代物,即偽造的對象身冀。利用Stub钝尸,使被測試代碼可以得到所有需要的輸入,獨立地測試了代碼邏輯闽铐。破除依賴首先需要找到被測試工作單元使用的外部接口蝶怔,然后把這個接口的底層實現(xiàn)替換成Stub。這里的『替換』就是我們常說的『依賴注入』兄墅,下面介紹幾種常見的依賴注入方法踢星。

  • 構(gòu)造函數(shù)注入
    使用這種方法,需要給被測試類添加一個新的構(gòu)造函數(shù)(或者給已有的構(gòu)造函數(shù)添加一個新參數(shù))隙咸,參數(shù)傳入Stub沐悦,然后在被測試類眾添加一個局部字段用于保存Stub,供被測試方法使用五督。
  • 用屬性get或set注入
    這里需要為每個要注入的依賴項添加一個屬性get和set藏否,然后在被測試代碼中需要的地方使用這些依賴。
  • 從工廠類返回給被測試代碼依賴項
    首先讓被測試的工作單元使用工廠類返回的對象實例充包,然后測試代碼中配置該工廠類副签,讓它返回一個Stub。
  • 偽造工廠類
    實現(xiàn)自定義的工廠類基矮,該自定義的工廠類返回一個Stub淆储,然后把這個偽工廠類賦給被測試的工作單元。
  • 繼承被測試類
    繼承被測試類家浇,重寫其虛工廠方法本砰,使其返回Stub。

使用Mock進(jìn)行交互測試

在上一篇『單元測試之如何編寫優(yōu)秀的單元測試用例』中钢悲,我們了解了工作單元有三種最終結(jié)果:返回值点额、內(nèi)部狀態(tài)改變、調(diào)用第三方對象莺琳』估猓基于值的測試驗證了一個函數(shù)的返回值;基于狀態(tài)的測試改變被測試對象的狀態(tài)芦昔,然后驗證其可見的狀態(tài)變化诱贿;交互測試則是驗證一個對象如何向其他對象發(fā)送消息的測試。實際單元測試中,優(yōu)先考慮基于值珠十、基于狀態(tài)的測試方法料扰,因為這兩種測試可以減少對代碼內(nèi)部細(xì)節(jié)的假設(shè)。

Mock是系統(tǒng)中一個偽造的對象焙蹭,它可以驗證被測試對象是否按照預(yù)期的方式調(diào)用了這個偽對象晒杈。Mock與Stub都是偽對象,但是使用Stub時孔厉,Stub只是輔助測試運(yùn)行拯钻,單元測試代碼仍然是對工作單元進(jìn)行斷言;使用Mock時撰豺,Mock對象會記錄所有工作單元與其進(jìn)行的通訊粪般,單元測試代碼是對Mock對象進(jìn)行斷言,用來檢驗交互污桦。

隔離框架應(yīng)運(yùn)而生

前面介紹了Stub和Mock在單元測試中的重要作用亩歹,但是如果使用手工的Stub和Mock會出現(xiàn)一些缺陷:

  • 如果類或者接口有很多方法、屬性凡橱,那么就很難為其編寫Stub和Mock對象
  • Mock對象需要記錄所有工作單元與其通訊的信息小作,手工編寫工作量大且易出錯
  • 難以在其他測試中重用Stub和Mock對象

隔離框架是一套API,使用這套API可以在運(yùn)行時創(chuàng)建和配置偽對象稼钩。下面介紹隔離框架常見功能:

  • 動態(tài)生成偽對象(Stub顾稀、Mock)
  • 模擬返回值和異常
  • 參數(shù)匹配
  • 驗證方法調(diào)用次數(shù)
    使用隔離框架,會讓我們得單元測試變得更加輕松坝撑,幫助我們編寫更加易讀静秆、易維護(hù)、更可靠的測試代碼巡李。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诡宗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子击儡,更是在濱河造成了極大的恐慌,老刑警劉巖蝠引,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阳谍,死亡現(xiàn)場離奇詭異,居然都是意外死亡螃概,警方通過查閱死者的電腦和手機(jī)矫夯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吊洼,“玉大人训貌,你說我怎么就攤上這事。” “怎么了递沪?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵豺鼻,是天一觀的道長。 經(jīng)常有香客問我款慨,道長儒飒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任檩奠,我火速辦了婚禮桩了,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘埠戳。我一直安慰自己井誉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布整胃。 她就那樣靜靜地躺著颗圣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爪模。 梳的紋絲不亂的頭發(fā)上欠啤,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音屋灌,去河邊找鬼洁段。 笑死,一個胖子當(dāng)著我的面吹牛共郭,可吹牛的內(nèi)容都是我干的祠丝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼除嘹,長吁一口氣:“原來是場噩夢啊……” “哼写半!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尉咕,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叠蝇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后年缎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悔捶,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年单芜,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜕该。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡洲鸠,死狀恐怖堂淡,靈堂內(nèi)的尸體忽然破棺而出馋缅,到底是詐尸還是另有隱情,我是刑警寧澤绢淀,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布萤悴,位于F島的核電站,受9級特大地震影響更啄,放射性物質(zhì)發(fā)生泄漏稚疹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一祭务、第九天 我趴在偏房一處隱蔽的房頂上張望内狗。 院中可真熱鬧,春花似錦义锥、人聲如沸柳沙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赂鲤。三九已至,卻和暖如春柱恤,著一層夾襖步出監(jiān)牢的瞬間数初,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工梗顺, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留泡孩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓寺谤,卻偏偏與公主長得像仑鸥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子变屁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理舆乔,服務(wù)發(fā)現(xiàn)谢鹊,斷路器,智...
    卡卡羅2017閱讀 134,661評論 18 139
  • 一当窗、百變怪 Mockito Mockito可謂是Java世界的百變怪这吻,使用它宵膨,可以輕易的復(fù)制出各種類型的對象倍试,并與...
    羅力閱讀 3,925評論 3 18
  • 1.Creating mock objects 1.1Class mocks idclassMock=OCMCla...
    奔跑的小小魚閱讀 2,593評論 0 0
  • 有幾次情緒不好的時候蛔垢,老公陪在我身邊,會說迫悠, “還記得我第一次去你家鹏漆,你媽跟我說了什么嗎?媽說,'小蔥心眼好艺玲,就是...
    叢叢xu閱讀 538評論 1 1
  • 今天括蝠,以前幾位玩得挺好同事聚會。本來不去或者帶小暖男去的饭聚。跟同事說了一下忌警,她很慷慨地說,把孩子放她家秒梳,直接晚上住她...
    米勒Li閱讀 153評論 0 0