前面講完stub,本篇則說明mock,也就是「模擬對象」。這篇會說明模擬對象的意義和使用時間,並且區分mock和stub的差異
前面的stub範例,都是有回傳值或是狀態改變,但是萬一測試的對象是沒有任何回傳值,或是保有任何狀態?又有可能當對象其中一些複雜的邏輯,無法輕易的使用stub的方式去測試,這時候就需要mock上場了。
在書本的中定義:是一個系統中的偽對象,可以驗證被測試的對象是否有按照預期的方式調用自己,進而測試「通過」還是「失敗」。通常每個測試最多只有一個mock。
看起來意思很接近stub。作者對於stub,認為其是輔助測試,讓「被測試對象」可以取得自己的偽對象,用這個假的資料進行測試。而mock,則是記錄所有的通訊資訊,也就是做出用來測試的「被測試對象」,用這個做出來的「被測試對象」進行測試。
其中最大的區別是:
就以LogAnalyzer
為說明。假設整個流程是從網頁中上傳檔案,然後經由LogAnalyzer
來檢查log檔名,當檔名不正確的時候,網頁顯示錯誤。
然而這個程式仍在開發中,我們只做好了LogAnalyzer
,但是網頁那邊的功能還沒有完成。就算完成了整個流程太長,會增加很多測試時間。就好像會需要開啟網頁,按下選擇檔案按鈕,選擇檔案,按下上傳按鈕,上傳檔案,取得檔名(是不是很麻煩XD)。這個時候就是需要mock囉!
重新設計一個interface(接口),把這個interface導向我們的mock,這個mock就是我們模擬的網站上傳功能囉!
所以我們需要一個簡單的interface來代替原本流程中「從網頁上傳檔案」。
因此流程從:網頁上傳 -->...--> 檢查檔名是否為log檔 --> yes / no,變成:「製作出網頁上傳的檔案名稱」--> 檢查檔名是否為log檔 --> yes / no,前面的諸多動作都被取代掉,而且assert不是功能本身,而是mock自己。