模擬對象
出自 MBA智库百科(https://wiki.mbalib.com/)
模擬對象(mock object)
目錄 |
在面向對象程式設計中,模擬對象也譯作模仿對象。是以可控的方式模擬真實對象行為的假的對象。程式員通常創造模擬對象來測試其他對象的行為,很類似汽車設計者使用碰撞測試假人來模擬車輛碰撞中人的動態行為。
在單元測試中,模擬對象可以模擬複雜的、真實的(非模擬)對象的行為, 如果真實的對象無法放入單元測試中,使用模擬對象就很有幫助。
在下麵的情形,可能需要使用模擬對象來代替真實對象:
- 真實對象的行為是不確定的(例如,當前的時間或當前的溫度);
- 真實對象很難搭建起來;
- 真實對象的行為很難觸發(例如,網路錯誤);
- 真實對象速度很慢(例如,一個完整的資料庫,在測試之前可能需要初始化);
- 真實的對象是用戶界面,或包括用戶界面在內;
- 真實的對象使用了回調機制;
- 真實對象可能還不存在;
- 真實對象可能包含不能用作測試(而不是為實際工作)的信息和方法。
例如,一個可能會在特定的時間響鈴的鬧鐘程式可能需要外部世界的當前時間。要測試這一點,測試一直要等到鬧鈴時間才知道鬧鐘程式是否正確地響鈴。如果使用一個模擬對象替代真實的對象,可以變成提供一個鬧鈴時間(不管是否實際時間),這樣就可以隔離地測試鬧鐘程式。
模擬對象的使用可能會將單元測試與被測代碼的實現耦合得很緊。例如,許多模擬對象框架允許開發人員指定模擬對象上方法被調用的次序和調用的次數,這樣,測試通過後對代碼進行重構,即使方法依然遵守以前實現的契約,也可能會造成測試失敗。這說明單元測試應當測試方法的外部行為,而非其內部實現。在單元測試測試用例中過度使用模擬對象可能導致隨著系統的發展,不斷進行的重構會造成維護測試本身的工作量出現顯著的增長。在發展過程中,這種測試的不正確地維護可能會漏報錯誤,而在使用真實對象進行的測試中會捕捉到。相反,與設置好整個真實對象相比,簡單地模擬一個方法可能需要更少的配置,因此減少了需要的維護工作。
模擬對象必須要準確地建模它們要模擬的對象的行為,然而,如果要模擬的對象來自另一個開發人員或項目,或者如果還沒有開發出來,準確的建模是很難做到。如果沒有正確建模行為,那麼可能會單元測試記錄通過,而真正運行時,在同樣條件下可能會造成測試失敗。