單元測試的目標是一次只驗證一個方法
要是你的測試依賴於系統的其他部分
再讓我們看一個更加具體的情況
幸運的是
關於什麼時候需要Mock對象
使用mock對象進行測試的時候
在此我們又一次看到了針對接口編程的重要性了
public interface Environmental {
private boolean playedWav = false;
public long getTime();
public void playWavFile(String fileName);
public boolean wavWasPlayed();
public void resetWav();
}
真實的實現代碼
public class SystemEnvironment implements Environmental {
public long getTime() {
return System
}
public void playWavFile(String fileName) {
playedWav = true;
}
public boolean wavWasPlayed() {
return playedWav;
}
public void resetWav() {
playedWav = false;
}
}
下面是mock對象
public class MockSystemEnvironment implements Environmental {
private long currentTime;
public long getTime() {
return currentTime;
}
public void setTime(long currentTime) {
this
}
public void playWavFile(String fileName) {
playedWav = true;
}
public boolean wavWasPlayed() {
return playedWav;
}
public void resetWav() {
playedWav = false;
}
}
下面是一個調用getTime的具體類
import java
public class Checker {
private Environmental env;
public Checker(Environmental env) {
this
}
public void reminder() {
Calendar cal = Calendar
cal
int hour = cal
if(hour >=
env
}
}
}
使用env
import java
import junit
public class TestChecker extends TestCase {
public void testQuittingTime() {
MockSystemEnvironment env = new MockSystemEnvironment();
Calendar cal = Calendar
cal
cal
cal
cal
cal
long t
env
Checker checker = new Checker(env);
checker
assertFalse(env
t
env
checker
assertTrue(env
env
t
env
checker
assertTrue(env
}
}
這就是mock對象的全部
如果每次都像上面那樣自己寫具體的mock對象
下面就以利用EasyMock模擬測試Servlet組件為例
import org
import junit
import javax
public class MockRequestTest extends TestCase{
private MockControl control;
private HttpServletRequest mockRequest;
public void testMockRequest(){
//創建一個Mock HttpServletRequest的MockControl對象
control = MockControl
//獲取一個Mock HttpServletRequest對象
mockRequest = (HttpServletRequest) control
//設置期望調用的Mock HttpServletRequest對象的方法
mockRequest
//設置調用方法期望的返回值
//以下後兩個參數表示最少調用一次
control
//設置Mock HttpServletRequest的狀態
//表示此Mock HttpServletRequest對象可以被使用
control
//使用斷言檢查調用
assertEquals(
//驗證期望的調用
control
}
}
編譯並將其當做一個Test Case運行
讓我們來回憶一下
MockObject的主頁 ;介紹了關鍵Mock Object的基本概念和目前在各個環境下主要的Mock測試工具
JMock的主頁;可以獲取JMock的最新代碼和開發包
EasyMock的主頁;可以獲取JMock的最新代碼和開發包
NMock的主頁;介紹了在Microsoft
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19222.html