使用Mock Object進(jìn)行測試,主要是用來(lái)模擬那些在應用中不容易構造(如HttpServletRequest必須在Servlet容器中才能構造出來(lái))或者比較復雜的對象(如JDBC中的ResultSet對象)從而使測試順利進(jìn)行的工具。
目前,在Java陣營(yíng)中主要的Mock測試工具有JMock,MockCreator,Mockrunner,EasyMock,MockMaker等,在微軟的.Net陣營(yíng)中主要是Nmock,.NetMock等。
以下就對在Java中使用的Mock Object進(jìn)行測試的常用工具做一下使用說(shuō)明。
請訪(fǎng)問(wèn)http://www.jmock.org。
1. 獲取J2SDK;
2. 獲取JUnit V
3. 獲取JMock V1.0(從http://www.jmock.org獲取JMock開(kāi)發(fā)包)。
4. 為了開(kāi)發(fā)方便,建議使用一個(gè)好IDE。以下例子中的代碼均是在Eclipse V3.0環(huán)境下進(jìn)行的調試。
以下是一個(gè)簡(jiǎn)單例子,代碼如下:
package test1;
import org.jmock.*;
import javax.servlet.http.*;
public class MockRequestTest extends MockObjectTestCase{
public void testMockRequest1(){
//構造一個(gè)Mock對象
Mock mock = new Mock(HttpServletRequest.class);
//設置要執行的操作,以下設置表示要調用一次HttpServletRequest對象的
//getParameter方法,傳遞的參數是"name",期望的返回是"kongxx"
mock.expects(once()).method("getParameter").with(eq("name")).will(returnValue("kongxx"));
//根據Mock對象獲取一個(gè)HttpServletRequest對象
HttpServletRequest request = (HttpServletRequest)mock.proxy();
//斷言調用結果
assertEquals("kongxx" ,request.getParameter("name"));
}
public void testMockRequest2(){
//構造一個(gè)Mock對象
Mock mock = new Mock(HttpServletRequest.class);
//設置要執行的操作,以下設置表示要調用一次HttpServletRequest對象的
//getParameter方法,傳遞的參數是"name",期望的返回是"kongxx"
mock.expects(once()).method("getParameter").with(eq("name")).will(returnValue("kongxx"));
//根據Mock對象獲取一個(gè)HttpServletRequest對象
HttpServletRequest request = (HttpServletRequest)mock.proxy();
//調用HttpServletRequest對象的方法
request.getParameter("name");
//驗證執行結果
mock.verify();
}
}
編譯并將其當做一個(gè)Test Case運行,會(huì )發(fā)現兩個(gè)測試方法均測試成功。
MyClass需要測試的類(lèi),提供了兩個(gè)方法getName和getPassword,都使用HttpServletRequest作為輸入參數并返回從HttpServletRequest中取得的參數,具體代碼如下:
package test2;
import javax.servlet.http.*;
public class MyClass {
public String getName(HttpServletRequest request) {
return request.getParameter("name");
}
public String getPassword(HttpServletRequest request) {
return request.getParameter("password");
}
}
TestMyClass測試類(lèi),其中構造了一個(gè)假的HttpServletRequest對象,用來(lái)測試MyClass中的getName和getPassword方法,代碼如下:
package test2;
import org.jmock.*;
import javax.servlet.http.*;
public class TestMyClass extends MockObjectTestCase{
private MyClass myclass ;
private Mock mockRequest ;
private HttpServletRequest request ;
public void setUp() {
myclass = new MyClass();
//構造一個(gè)Mock對象
mockRequest = new Mock(HttpServletRequest.class);
//根據Mock對象獲取一個(gè)HttpServletRequest對象
request = (HttpServletRequest)mockRequest.proxy();
}
public void tearDown() {
//TODO
}
public void testGetName(){
//設置要執行的操作,以下設置表示要調用一次HttpServletRequest對象的
//getParameter方法,傳遞的參數是"name",期望的返回是"kongxx"
mockRequest.expects(atLeastOnce()).method("getParameter").with(eq("name")).will(returnValue("kongxx"));
assertNotNull(myclass.getName(request));
assertEquals("kongxx" ,myclass.getName(request));
}
public void testGetPassword(){
//設置要執行的操作,以下設置表示要調用一次HttpServletRequest對象的
//getParameter方法,傳遞的參數是"password",期望的返回是"123456789"
mockRequest.expects(atLeastOnce()).method("getParameter").with(eq("password")).will(returnValue("123456789"));
assertNotNull(myclass.getPassword(request));
assertEquals("123456789" ,myclass.getPassword(request));
}
}
編譯并將其當做一個(gè)Test Case運行,會(huì )發(fā)現兩個(gè)測試方法均測試成功。
無(wú)
請訪(fǎng)問(wèn)http://www.easymock.org。
1. 獲取J2SDK;
2. 獲取JUnit V
3. 獲取EasyMock V1.1(從http://www.easymock.org獲取EasyMock開(kāi)發(fā)包)。
4. 為了開(kāi)發(fā)方便,建議使用一個(gè)好IDE。以下例子中的代碼均是在Eclipse V3.0環(huán)境下進(jìn)行的調試。
以下是一個(gè)簡(jiǎn)單例子,為了方便對比,這里重新實(shí)現了JMock例子一,代碼如下:
package test1;
import org.easymock.*;
import junit.framework.*;
import javax.servlet.http.*;
public class MockRequestTest extends TestCase{
private MockControl control;
private HttpServletRequest mockRequest;
public void testMockRequest(){
//創(chuàng )建一個(gè)Mock HttpServletRequest的MockControl對象
control = MockControl.createControl(HttpServletRequest.class);
//獲取一個(gè)Mock HttpServletRequest對象
mockRequest = (HttpServletRequest) control.getMock();
//設置期望調用的Mock HttpServletRequest對象的方法
mockRequest.getParameter("name");
//設置調用方法期望的返回值,并指定調用次數
//以下后兩個(gè)參數表示最少調用一次,最多調用一次
control.setReturnValue("kongxx" ,1 ,1);
//設置Mock HttpServletRequest的狀態(tài),
//表示此Mock HttpServletRequest對象可以被使用
control.replay();
//使用斷言檢查調用
assertEquals("kongxx",mockRequest.getParameter("name"));
//驗證期望的調用
control.verify();
}
}
編譯并將其當做一個(gè)Test Case運行,會(huì )發(fā)現兩個(gè)測試方法均測試成功。
同例子一樣,對JMock例子二重新實(shí)現產(chǎn)生了EasyMock的例子二。
需要測試的類(lèi)代碼如下:
package test2;
import javax.servlet.http.*;
public class MyClass {
public String getName(HttpServletRequest request) {
return request.getParameter("name");
}
public String getPassword(HttpServletRequest request) {
return request.getParameter("password");
}
}
測試類(lèi)代碼如下:
package test2;
import org.easymock.*;
import junit.framework.*;
import javax.servlet.http.*;
public class TestMyClass extends TestCase{
private MockControl control;
private HttpServletRequest mockRequest;
private MyClass myclass ;
public void setUp() {
myclass = new MyClass();
//創(chuàng )建一個(gè)Mock HttpServletRequest的MockControl對象
control = MockControl.createControl(HttpServletRequest.class);
//獲取一個(gè)Mock HttpServletRequest對象
mockRequest = (HttpServletRequest) control.getMock();
}
public void tearDown() {
//TODO
}
public void testGetName(){
//設置期望調用的Mock HttpServletRequest對象的方法
mockRequest.getParameter("name");
//設置調用方法期望的返回值,并指定調用次數
//以下后兩個(gè)參數表示最少調用一次,最多調用一次
control.setReturnValue("kongxx" ,1 ,2);
//設置Mock HttpServletRequest的狀態(tài),
//表示此Mock HttpServletRequest對象可以被使用
control.replay();
//使用斷言檢查調用
assertNotNull(myclass.getName(mockRequest));
assertEquals("kongxx",myclass.getName(mockRequest));
//驗證期望的調用
control.verify();
}
public void testGetPassword(){
//設置期望調用的Mock HttpServletRequest對象的方法
mockRequest.getParameter("password");
//設置調用方法期望的返回值,并指定調用次數
//以下后兩個(gè)參數表示最少調用一次,最多調用一次
control.setReturnValue("kongxx" ,1,2);
//設置Mock HttpServletRequest的狀態(tài),
//表示此Mock HttpServletRequest對象可以被使用
control.replay();
//使用斷言檢查調用
assertNotNull(myclass.getPassword(mockRequest));
assertEquals("kongxx",myclass.getPassword(mockRequest));
//驗證期望的調用
control.verify();
}
}
編譯并將其當做一個(gè)Test Case運行,會(huì )發(fā)現兩個(gè)測試方法均測試成功。
無(wú)
無(wú)
l http://www.mockobjects.com/介紹了關(guān)鍵Mock Object的基本概念和目前在各個(gè)環(huán)境下主要的Mock測試工具。
l JMock的主頁(yè)http://www.jmock.org,可以獲取JMock的最新代碼和開(kāi)發(fā)包,以及一些說(shuō)明文檔。
l EasyMock的主頁(yè)http://www.easymock.org,可以獲取JMock的最新代碼和開(kāi)發(fā)包,以及一些說(shuō)明文檔。
l NMock的主頁(yè)http://www.nmock.org,介紹了在Microsoft .Net平臺上進(jìn)行Mock測試的開(kāi)發(fā)工具。
l MockCreator主頁(yè)http://mockcreator.sourceforge.net/。
l MockMaker主頁(yè)http://mockmaker.sourceforge.net/。
【日期:2006-9-3】【作者:不祥】【轉載自:開(kāi)店樂(lè )】
聯(lián)系客服