1. 程式人生 > >深入理解Mock工作原理

深入理解Mock工作原理

Mock的作用不同於Spy,Fake。Mock主要用於測被測體與外部的互動邏輯。一般是指在不同的場景下多次的與外部互動。當外部依賴是硬體,或者外部程式不ready的情況下,Mock就能幫助完成單元測試。

以下圖為例,FlashDriver與IO系統有多次的互動,互動函式是read,和write。根據需求,在一次燒寫flash操作中,先要呼叫兩次write,然後根據read返回的結果不同,採取不同的互動操作。每個Case需要設定write,read的不同輸入與不同輸出以模擬各種場景。(在每個case中,MockIO就像simulation一樣。)

見下圖中MockIO的測試case,該Case可以預先設定每次讀寫操作的引數。下面一共設定了4次。設定完畢後,呼叫Flash_Write函式。如果Flash_Write函式操作流程符合上述4步預設步驟及引數,則case通過。

下面只是一種測試場景,其他的場景可能是3才操作,5次操作或者多次操作。Mock的作用就是能通過設定輸入輸出值,讓被測程式碼的各種工作場景都可以被測試覆蓋。


上述程式是由程式自身實現了Mock機制(事先準備資料,呼叫時候逐一使用)。當前已經有現成的Mock工具:如與GTest搭配的GMock,與JUnit搭配的EasyMock。這樣現成的工具能方便的設定被mock物件及函式的呼叫引數及返回值。

為方便測試,程式設計應該採用依賴倒置原則,讓被測試類依賴於介面。Mock類實現該介面。被測類通過呼叫介面最終呼叫到Mock類,完成測試。而被測試類可以不作任何修改就能在實際系統裡工作。這就是使用TDD能很自然的使產品程式碼於外部依賴鬆耦合。