mock的使用場合和時(shí)機(jī):
(1)單元測試/接口測試中測試對(duì)象依賴其他對(duì)象,這些被依賴的對(duì)象構(gòu)造復(fù)雜或耗時(shí)或根本無法構(gòu)造(未交付)
(2)我們只測試對(duì)象內(nèi)部邏輯的質(zhì)量,不關(guān)心依賴對(duì)象的邏輯正確性和穩(wěn)定性
基于以下兩個(gè)原則去做mock。這樣mock的投入產(chǎn)出比是最高的。
(1)不需要對(duì)所有的依賴對(duì)象進(jìn)行mock,只對(duì)那些構(gòu)造復(fù)雜、構(gòu)造比較耗時(shí)的依賴進(jìn)行mock
(2)若是分層自動(dòng)化,高層的測試設(shè)計(jì)可以基于以下假設(shè):
? ? ? ?低層的測試已保證低層對(duì)象的質(zhì)量,高層對(duì)低層的依賴可以mock
mock一方面加擋板,一方面可模擬返回?cái)?shù)據(jù)。
測試驅(qū)動(dòng)開發(fā)(TDD)在接口實(shí)現(xiàn)之前可以寫接口測試。在開發(fā)過程中把測試添加到自動(dòng)化測試環(huán)境中。
防止系統(tǒng)B出錯(cuò)引起測試錯(cuò)誤
不會(huì)因系統(tǒng)B的開發(fā)進(jìn)度影響測試,只要定義好了接口mock后即使B未開發(fā)完成仍能進(jìn)行測試
一些速度較慢的操作處理復(fù)雜邏輯的接口,mock后可以快速返回,提升測試效率
模擬在應(yīng)用中不容易構(gòu)造的對(duì)象或比較復(fù)雜的對(duì)象,從而使測試順利進(jìn)行
mock的壞處在于很多情況下無法完全模擬出服務(wù)器的所有可能的返回情況,另外,mock掉了關(guān)聯(lián)方之后,整個(gè)環(huán)境的連通性可能測試的不到位。
Mock 的關(guān)鍵點(diǎn)
模擬對(duì)象的概念就是我們想要?jiǎng)?chuàng)建一個(gè)可以替代實(shí)際對(duì)象的對(duì)象,這個(gè)模擬對(duì)象要可以通過特定參數(shù)調(diào)用特定的方法,并且能返回預(yù)期結(jié)果。
樁指的是用來替換具體功能的程序段。樁程序可以用來模擬已有程序的行為或是對(duì)未完成開發(fā)程序的一種臨時(shí)替代。
比如我們有一個(gè)獲取溫度的函數(shù)。
publicdoublegetTemperature(String Position) {doubleret = TemperatureRead(Position);}
但是 TemperatureRead 函數(shù)要調(diào)用具體的硬件設(shè)備,而硬件設(shè)備沒準(zhǔn)備好。
我們可以用 Stub 來替換
publicdoubleTemperatureRead(String position) {return28;}
Stub:For replacing a method with code that returns a specified result
Mock:A stub with an expectations that the method gets called
通過設(shè)置預(yù)期明確 Mock 對(duì)象執(zhí)行時(shí)會(huì)發(fā)生什么,比如返回特定的值、拋出一個(gè)異常、觸發(fā)一個(gè)事件等,又或者調(diào)用一定的次數(shù)。
設(shè)置預(yù)期和驗(yàn)證預(yù)期是同時(shí)進(jìn)行的。設(shè)置預(yù)期在調(diào)用測試類的函數(shù)之前完成,驗(yàn)證預(yù)期則在它之后。所以,首先你設(shè)定好預(yù)期結(jié)果,然后去驗(yàn)證你的預(yù)期結(jié)果是否正確。
提前創(chuàng)建測試; TDD(測試驅(qū)動(dòng)開發(fā))
這是個(gè)最大的好處吧。如果你創(chuàng)建了一個(gè)Mock那么你就可以在service接口創(chuàng)建之前寫Service Tests了,這樣你就能在開發(fā)過程中把測試添加到你的自動(dòng)化測試環(huán)境中了。換句話說,模擬使你能夠使用測試驅(qū)動(dòng)開發(fā)。
這類似于上面的那點(diǎn);為不存在的代碼創(chuàng)建測試。但前面講的是開發(fā)人員編寫測試程序,這里說的是測試團(tuán)隊(duì)來創(chuàng)建。當(dāng)還沒有任何東西要測的時(shí)候測試團(tuán)隊(duì)如何來創(chuàng)建測試呢?模擬并針對(duì)模擬測試!這意味著當(dāng)service借口需要測試時(shí),實(shí)際上QA團(tuán)隊(duì)已經(jīng)有了一套完整的測試組件;沒有出現(xiàn)一個(gè)團(tuán)隊(duì)等待另一個(gè)團(tuán)隊(duì)完成的情況。這使得模擬的效益型尤為突出了。
你可以創(chuàng)建一個(gè)驗(yàn)證或者演示程序
由于Mocks非常高效,Mocks可以用來創(chuàng)建一個(gè)概念證明,作為一個(gè)示意圖,或者作為一個(gè)你正考慮構(gòu)建項(xiàng)目的演示程序。這為你決定項(xiàng)目接下來是否要進(jìn)行提供了有力的基礎(chǔ),但最重要的還是提供了實(shí)際的設(shè)計(jì)決策。
這個(gè)好處不屬于實(shí)際效益的一種,而是作為一個(gè)必要時(shí)的“救生圈”。有沒有遇到這樣的情況?當(dāng)你想要測試一個(gè)service接口,但service需要經(jīng)過防火墻訪問,防火墻不能為你打開或者你需要認(rèn)證才能訪問。遇到這樣情況時(shí),你可以在你能訪問的地方使用MockService替代,這就是一個(gè)“救生圈”功能。
在有些情況下,某種原因你需要允許一些外部來源訪問你的測試系統(tǒng),像合作伙伴或者客戶。這些原因?qū)е聞e人也可以訪問你的敏感信息,而你或許只是想允許訪問部分測試環(huán)境。在這種情況下,如何向合作伙伴或者客戶提供一個(gè)測試系統(tǒng)來開發(fā)或者做測試呢?最簡單的就是提供一個(gè)mock,無論是來自于你的網(wǎng)絡(luò)或者客戶的網(wǎng)絡(luò)。soapUI mock非常容易配置,他可以運(yùn)行在soapUI或者作為一個(gè)war包發(fā)布到你的java服務(wù)器里面。
有時(shí),你希望在沒有系統(tǒng)其他部分的影響下測試系統(tǒng)單獨(dú)的一部分。由于其他系統(tǒng)部分會(huì)給測試數(shù)據(jù)造成干擾,影響根據(jù)數(shù)據(jù)收集得到的測試結(jié)論。使用mock你可以移除掉除了需要測試部分的系統(tǒng)依賴的模擬。當(dāng)隔離這些mocks后,mocks就變得非常簡單可靠,快速可預(yù)見。這為你提供了一個(gè)移除了隨機(jī)行為,有重復(fù)模式并且可以監(jiān)控特殊系統(tǒng)的測試環(huán)境。
Mockito 是一個(gè)簡單的流行的 Mock 框架。它能夠幫我們創(chuàng)建 Mock 對(duì)象,保持單元測試的獨(dú)立性。
使用它只需要在 Maven 中添加依賴即可。
org.mockitomockito-all2.0.2-beta
class CreateMock {
@Beforepublicvoidsetup() {? ? ? ??
mockUserDao = mock(UserDao.class);? ? ? ? ??
userService =newUserServiceImpl();? ? ? ? ??
userService.setUserDao(mockUserDao);? ??
? }}
class CreateMock {
@Mock
UserDao mockUserDao;
@InjectMocks
privateUserServiceImpl userService;
@Before
publicvoidsetUp() {
//初始化對(duì)象的注解?
MockitoAnnotations.initMocks(this);? ??
? }? }
參考:https://blog.csdn.net/wwh578867817/article/details/51934404