servlet request和response的模擬單元測試
專案採用分層開發,服務端和客戶端。服務端的開發需要測試,但是涉及到了servletrequest和servletresponse。這裡提供兩種方法。
1、easymock
2、springmock
第一種方法
程式碼
Java程式碼- package com.zzrenfeng.util;
- import org.apache.commons.logging.*;
- import org.junit.*;
- import org.junit.runner.*;
- import org.springframework.mock.web.*;
-
import org.springframework.test.context.*;
- import org.springframework.test.context.junit4.*;
- import org.springframework.test.context.support.*;
- import com.zzrenfeng.util.meetingapp.*;
- /**
- *
- * @ClassName: UserServiceTest
- * @Description: 單主鍵jdbcdao測試
- * @author renjunjie
- * @date 2010-12-10 下午03:20:08
- *
- */
-
@RunWith(SpringJUnit4ClassRunner.class
- @TestExecutionListeners( { DependencyInjectionTestExecutionListener.class })
- @ContextConfiguration(locations={ "classpath:resource/applicationContext-test.xml"})
- public class HttpServletTest {
- private static final Log log = LogFactory.getLog(HttpServletTest.class);
-
private MockHttpServletRequest request;
- private MockHttpServletResponse response;
- @Before
- public void setUp(){
- request = new MockHttpServletRequest();
- request.setCharacterEncoding("UTF-8");
- response = new MockHttpServletResponse();
- }
- @Test
- public void test(){
- SecurityApplication sa = new SecurityApplication();
- //request.setRequestURI("/loginCheck.html");
- request.addParameter("userId", "9001"); //直接新增request引數,相當簡單
- String result = sa.getPerson(request);
- System.out.println(result);
- }
- }
第二種方法
Java程式碼- package com.zzrenfeng.util;
- import javax.servlet.http.*;
- import org.apache.commons.logging.*;
- import org.easymock.*;
- import org.junit.*;
- import org.junit.runner.*;
- import org.springframework.test.context.*;
- import org.springframework.test.context.junit4.*;
- import org.springframework.test.context.support.*;
- import com.zzrenfeng.util.meetingapp.*;
- /**
- *
- * @ClassName: UserServiceTest
- * @Description: 單主鍵jdbcdao測試
- * @author renjunjie
- * @date 2010-12-10 下午03:20:08
- *
- */
- @RunWith(SpringJUnit4ClassRunner.class)
- @TestExecutionListeners( { DependencyInjectionTestExecutionListener.class })
- //@ContextConfiguration(locations={ "file:WebContent/WEB-INF/red5-web.xml"})
- @ContextConfiguration(locations={ "classpath:resource/applicationContext-test.xml"})
- public class HttpServletTest2 {
- private static final Log log = LogFactory.getLog(HttpServletTest2.class);
- private HttpServletRequest request;
- private HttpServletResponse response;
- @Before
- public void setUp(){
- //建立request和response的Mock
- request = (HttpServletRequest)EasyMock.createMock(HttpServletRequest.class);
- response = (HttpServletResponse) EasyMock.createMock(HttpServletResponse.class);
- }
- @Test
- public void test(){
- SecurityApplication sa = new SecurityApplication();
- EasyMock.expect(request.getParameter("opens")).andReturn("123").once(); //期望使用引數
- EasyMock.expect(request.getParameter("userId")).andReturn("9001").times(2); //期望呼叫的次數
- EasyMock.replay(request); //儲存期望結果
- String result = sa.getPersonMeetings3G(request);
- System.out.println(result);
- }
- }
EasyMock主要是為測試提供模擬資料,比如你可以模擬HttpServletRequest。
EasyMock 可以mock interface和抽象java 類,但是不可以mock擁有被final修飾方法的類,不能mock靜態方法(我遇到的情況是這樣)。
在使用的時候請注意:
org.easymock.classextension.EasyMock 被用來mock抽象類(abstract)和具體類
org.easymock.EasyMock被用來mock介面(interface)
使用用EasyMock的一般步驟:
1.建立一個mock物件
HttpServletRequest request = EasyMock.createMock(HttpServletRequest.class);
2.設定此物件的某個方法的返回值
EasyMock.expect(request.getParameter("userName")).andReturn("trilogy").once();
注意:必須手工設定被mock的方法的訪問次數
once()
antyTimes()
times(int)
建議:在設定方法呼叫次數的時候,雖然你可以呼叫anyTimes(),但是最好明確你要呼叫多少次如:once()、
times(2),這樣做的話顯的比較嚴謹。
如果mock的方法沒有返回值,可以這麼做:
request.setAttribute("userId");
EasyMock.expectLastCall().once();
對於被mock的方法引數,也可以不必指定具體的值:
EasyMock.expect(request.getParameter((String)EasyMock.anyObject())).andReturn("trilogy").once();
如果你想讓被mock的方法返回一個異常,前提是被mock的方法會丟擲異常,你可以這麼做:
EasyMock.expect(input.read()).andThrow(new IOException("Mocked IOException")).once();
你還可以根據呼叫順序來mock同一個方法:
EasyMock.expect(request.getParameter("userName")).andReturn("trilogy").once();
EasyMock.expect(request.getParameter("userName")).andReturn(null).once();
當第一次執行request.getParameter("userName")的時候,返回“trilogy”
當第二次執行request.getParameter("userName")的時候,返回null
3.儲存被mock的物件
EasyMock.replay(a);
4.在被mock的物件被應用之後,最好驗證一下我們所設定的mock物件是不是按我們預期執行。
EasyMock.verify(a);
總結:
EasyMock是一個相當方便的mock工具,可以為我們的測試工作提供極大的便利,特別是在測試web層或者資料庫訪問的時候。
在這裡我只是拋磚引玉地介紹了一下EasyMock的使用,其實EasyMock還有很多其它更高階的使用,如過你願意的話可以訪問以下的網址來獲得更多資訊:
官網:www.easymock.org