1. 程式人生 > >servlet request和response的模擬單元測試

servlet request和response的模擬單元測試

專案採用分層開發,服務端和客戶端。服務端的開發需要測試,但是涉及到了servletrequest和servletresponse。這裡提供兩種方法。

1、easymock

2、springmock

第一種方法

程式碼

Java程式碼  收藏程式碼
  1. package com.zzrenfeng.util;  
  2. import org.apache.commons.logging.*;  
  3. import org.junit.*;  
  4. import org.junit.runner.*;  
  5. import org.springframework.mock.web.*;  
  6. import org.springframework.test.context.*;  
  7. import org.springframework.test.context.junit4.*;  
  8. import org.springframework.test.context.support.*;  
  9. import com.zzrenfeng.util.meetingapp.*;  
  10. /** 
  11.  *  
  12.  * @ClassName: UserServiceTest 
  13.  * @Description: 單主鍵jdbcdao測試 
  14.  * @author renjunjie 
  15.  * @date 2010-12-10 下午03:20:08 
  16.  * 
  17.  */  
  18. @RunWith(SpringJUnit4ClassRunner.class
    )  
  19. @TestExecutionListeners( { DependencyInjectionTestExecutionListener.class })  
  20. @ContextConfiguration(locations={ "classpath:resource/applicationContext-test.xml"})  
  21. public class HttpServletTest  {  
  22.     private static final Log log = LogFactory.getLog(HttpServletTest.class);  
  23.     private MockHttpServletRequest request;    
  24.     private MockHttpServletResponse response;    
  25.     @Before  
  26.     public void setUp(){  
  27.         request = new MockHttpServletRequest();    
  28.         request.setCharacterEncoding("UTF-8");    
  29.         response = new MockHttpServletResponse();    
  30.     }  
  31.     @Test  
  32.     public void test(){  
  33.         SecurityApplication sa = new SecurityApplication();  
  34.          //request.setRequestURI("/loginCheck.html");    
  35.         request.addParameter("userId""9001"); //直接新增request引數,相當簡單  
  36.         String result = sa.getPerson(request);  
  37.         System.out.println(result);  
  38.     }  
  39. }  

 第二種方法

Java程式碼  收藏程式碼
  1. package com.zzrenfeng.util;  
  2. import javax.servlet.http.*;  
  3. import org.apache.commons.logging.*;  
  4. import org.easymock.*;  
  5. import org.junit.*;  
  6. import org.junit.runner.*;  
  7. import org.springframework.test.context.*;  
  8. import org.springframework.test.context.junit4.*;  
  9. import org.springframework.test.context.support.*;  
  10. import com.zzrenfeng.util.meetingapp.*;  
  11. /** 
  12.  *  
  13.  * @ClassName: UserServiceTest 
  14.  * @Description: 單主鍵jdbcdao測試 
  15.  * @author renjunjie 
  16.  * @date 2010-12-10 下午03:20:08 
  17.  * 
  18.  */  
  19. @RunWith(SpringJUnit4ClassRunner.class)  
  20. @TestExecutionListeners( { DependencyInjectionTestExecutionListener.class })  
  21. //@ContextConfiguration(locations={ "file:WebContent/WEB-INF/red5-web.xml"})  
  22. @ContextConfiguration(locations={ "classpath:resource/applicationContext-test.xml"})  
  23. public class HttpServletTest2  {  
  24.     private static final Log log = LogFactory.getLog(HttpServletTest2.class);  
  25.     private HttpServletRequest request;    
  26.     private HttpServletResponse response;    
  27.     @Before  
  28.     public void setUp(){  
  29.         //建立request和response的Mock    
  30.         request = (HttpServletRequest)EasyMock.createMock(HttpServletRequest.class);    
  31.         response = (HttpServletResponse) EasyMock.createMock(HttpServletResponse.class);    
  32.     }  
  33.     @Test  
  34.     public void test(){  
  35.         SecurityApplication sa = new SecurityApplication();  
  36.         EasyMock.expect(request.getParameter("opens")).andReturn("123").once();    //期望使用引數  
  37.         EasyMock.expect(request.getParameter("userId")).andReturn("9001").times(2);  //期望呼叫的次數  
  38.         EasyMock.replay(request);   //儲存期望結果  
  39.         String result = sa.getPersonMeetings3G(request);  
  40.         System.out.println(result);  
  41.     }  
  42. }  

 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