mock測試就是在測試過程中,對於某些不容易構造或者不容易獲取的對象,用一個虛擬的對象來創建以便測試的測試方法。
基本介紹
- 中文名:mock測試
- 作用:虛擬某些特定對象以便測試
- 使用範疇:真實對象不可確定,不可預測時
- 關鍵步驟:使用一個接口來描述對象
測試介紹,對象,對象使用範疇,關鍵步驟,測試工具,對象實例,Erlang版本,
測試介紹
對象
這個虛擬的對象就是mock對象。mock對象就是真實對象在調試期間的代替品。
對象使用範疇
真實對象具有不可確定的行為,產生不可預測的效果,(如:股票行情,天氣預報)真實對象很難被創建的 真實對象的某些行為很難被觸發真實對象實際上還不存在的(和其他開發小組或者和新的硬體打交道)等等。
關鍵步驟
使用一個接口來描述這個對象。在產品代碼中實現這個接口,在測試代碼中實現這個接口,在被測試代碼中只是通過接口來引用對象,所以它不知道這個引用的對象是真實對象,還是mock對象。
測試工具
使用Mock Object進行測試,主要是用來模擬那些在套用中不容易構造(如HttpServletRequest必須在Servlet容器中才能構造出來)或者比較複雜的對象(如JDBC中的ResultSet對象)從而使測試順利進行的工具。
目前,在Java陣營中主要的Mock測試工具有JMock,MockCreator,Mockrunner,EasyMock,MockMaker等,在微軟的.Net陣營中主要是Nmock,.NetMock等。
對象實例
一個鬧鐘根據時間來進行提醒服務,如果過了下午5點鐘就播放音頻檔案提醒大家下班了,如果我們要利用真實的對象來測試的話就只能苦苦等到下午五點,然後把耳朵放在音箱旁,我們應該利用mock對象來進行測試,這樣我們就可以模擬控制時間了,而不用苦苦等待時鐘轉到下午5點鐘了。下面是代碼:
public abstract class Environmental{ boolean playedWav=false; public abstract long getTime(); public abstract void playWavFile(String fileName); public abstract boolean wavWasPlayed(); public abstract void resetWav();}真實的實現代碼:
public class SystemEnvironment extends Environmental{ public long getTime(){ return System.currentTimeMillis(); } public void playWavFile(String fileName){ playedWav=true; } public boolean wavWasPlayed(){ return playedWav; } public void resetWav(){ playedWav=false; }}下面是mock對象:
public class MockSystemEnvironment extends Environmental{ private long currentTime; public long getTime(){ return currentTime; } public void setTime(long currentTime){ this.currentTime=currentTime; } public void playWavFile(String fileName){ playedWav=true; } public boolean wavWasPlayed(){ return playedWav; } public void resetWav(){ playedWav=false; }}
Erlang版本
put(current_time,os:timestamp()),put(played_wav,false),meck:new(mock_system_environment,[non_strict]),%模擬一個系統環境meck:expect(mock_system_environment,get_time,fun()->get(current_time)end),meck:expect(mock_system_environment,set_time,fun(CurrentTime)->put(current_time,CurrentTime)end),meck:expect(mock_system_environment,play_wav_file,fun(FileName)->put(played_wav,true)end),meck:expect(mock_system_environment,wav_was_played,fun()->get(played_wav)end),meck:expect(mock_system_environment,reset_wav,fun()->put(played_wav,false)end),casemock_system_environment:wav_was_played()oftrue->mock_system_environment:reset_wav();false->mock_system_environment:play_wav_file("mm.wav")end.
mock-
複合形 comb.form
1. 表示"模仿","假的"
mock測試可翻譯為mock-test