Mock概念介紹
-
mock的定義(what):
mock是在測試過程中,對于一些不容易構(gòu)造/獲取的對象,創(chuàng)建一個mock對象來模擬對象的行為
為什么要使用mock(why):
在做單元測試過程中,經(jīng)常會有以下的場景:
class A 依賴 class B
class B 依賴 class C和class D
class C 依賴 ...
class D 依賴 ...
1.被測對象依賴的對象構(gòu)造復(fù)雜
我們想對class A進行單元測試,需要構(gòu)造大量的class B、C、D等依賴對象,他們的構(gòu)造過程復(fù)雜(體現(xiàn)在構(gòu)造步驟多、耗時較長),這時我們可以利用mock去構(gòu)造虛擬的class B、C、D對象用于class A的測試,因為我們只是想測試class A的行為是否符合預(yù)期,我們并不需要測試依賴對象。
2.被測單元依賴的模塊尚未開發(fā)完成,而被測對象需要依賴模塊的返回值進行測試:
----- 比如service層的代碼中,包含對dao層的調(diào)用,但dao層代碼尚未開發(fā)
----- 比如web的前端依賴后端接口獲取數(shù)據(jù)進行聯(lián)調(diào)測試,但后端接口并未開發(fā)完成
- 哪些時機和場合需要使用mock(when&where)
1.單元測試/接口測試中測試對象依賴其他對象,這些對象的構(gòu)造復(fù)雜、耗時或者根本無法構(gòu)造(未交付)
2.我們只測試對象內(nèi)部邏輯的質(zhì)量,不關(guān)心依賴對象的邏輯正確性和穩(wěn)定性
- 是否應(yīng)該在測試中使用mock,投入產(chǎn)出比如何(how much)
我們可以基于以下2個原則去做mock,這樣的mock的投入產(chǎn)出比是最高的
1.不需要對所有的依賴對象/服務(wù)進行mock,只對那些構(gòu)造步驟復(fù)雜、構(gòu)造耗時較長、不穩(wěn)定的依賴對象/服務(wù)進行mock。
2.如果做分層測試(比如分層自動化),高層的測試設(shè)計可以基于以下假設(shè):低層的測試已保證低層對象的質(zhì)量,高層對低層的依賴可以mock,無需關(guān)心所依賴的低層對象的質(zhì)量。
- Local Mock和Remote Mock
Local Mock和Remote Mock的區(qū)別在于依賴對象的行為調(diào)用是本地/遠(yuǎn)程調(diào)用
1.Mock本地依賴對象
如果依賴對象的調(diào)用是本地調(diào)用,就屬于Local Mock。EasyMock/Mockito都可以實現(xiàn)對本地依賴對象的Mock。
2.Remote Mock
如果被測對象依賴對象的是一些遠(yuǎn)程服務(wù)(HTTP/RPC服務(wù)),就屬于Remote Mock,Remote Mock一般實現(xiàn)對指定的服務(wù)/接口、客戶端(消費者)進行Mock??梢酝ㄟ^Mock Server等方式去實現(xiàn)。

被測對象和依賴對象/服務(wù)的關(guān)系

Local&Remote Mock
- LocalMock相當(dāng)于使用Mock對象替換依賴對象。
- RemoteMock相當(dāng)于使用MockServer替換真實的HTTP/RPC Server。
Mock工具
1.EasyMock
Mockito簡介和代碼示例
2.Mockito
EasyMock簡介和代碼示例
3.PowerMock
PowerMock