Spring MVC 教程,快速入門,深入分析——如何給spring3 MVC中的Action做JUnit單元測試

 十三、如何給spring3 MVC中的Action做JUnit單元測試?

 使用了spring3 MVC後,給action做單元測試變得很方便,我以前從來不給action寫單元測試的,現在可以根據情況寫一些了。

 不用給每個Action都寫單元測試吧,自己把握吧。

 

 JUnitActionBase類是所有JUnit的測試類的父類

Java代碼  收藏代碼

  1. package test;  

  2. import javax.servlet.http.HttpServletRequest;  

  3. import javax.servlet.http.HttpServletResponse;  

  4. import org.junit.BeforeClass;  

  5. import org.springframework.mock.web.MockServletContext;  

  6. import org.springframework.web.context.WebApplicationContext;  

  7. import org.springframework.web.context.support.XmlWebApplicationContext;  

  8. import org.springframework.web.servlet.HandlerAdapter;  

  9. import org.springframework.web.servlet.HandlerExecutionChain;  

  10. import org.springframework.web.servlet.HandlerMapping;  

  11. import org.springframework.web.servlet.ModelAndView;  

  12. import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;  

  13. import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping;  

  14. /**  

  15. * 說明: JUnit測試action時使用的基類 

  16.  

  17. * @author  趙磊 

  18. * @version 創建時間:2011-2-2 下午10:27:03   

  19. */   

  20. public class JUnitActionBase {  

  21.     private static HandlerMapping handlerMapping;  

  22.     private static HandlerAdapter handlerAdapter;  

  23.     /** 

  24.      * 讀取spring3 MVC配置文件 

  25.      */  

  26.     @BeforeClass  

  27.  public static void setUp() {  

  28.         if (handlerMapping == null) {  

  29.             String[] configs = { "file:src/springConfig/springMVC.xml" };  

  30.             XmlWebApplicationContext context = new XmlWebApplicationContext();  

  31.             context.setConfigLocations(configs);  

  32.             MockServletContext msc = new MockServletContext();  

  33.             context.setServletContext(msc);         context.refresh();  

  34.             msc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);  

  35.             handlerMapping = (HandlerMapping) context  

  36.                     .getBean(DefaultAnnotationHandlerMapping.class);  

  37.             handlerAdapter = (HandlerAdapter) context.getBean(context.getBeanNamesForType(AnnotationMethodHandlerAdapter.class)[0]);     

  38.         }  

  39.     }  

  40.   

  41.     /** 

  42.      * 執行request對象請求的action 

  43.      *  

  44.      * @param request 

  45.      * @param response 

  46.      * @return 

  47.      * @throws Exception 

  48.      */  

  49.     public ModelAndView excuteAction(HttpServletRequest request, HttpServletResponse response)  

  50.  throws Exception {  

  51.         HandlerExecutionChain chain = handlerMapping.getHandler(request);  

  52.         final ModelAndView model = handlerAdapter.handle(request, response,  

  53.                 chain.getHandler());  

  54.         return model;  

  55.     }  

  56. }  

 

 

這是個JUnit測試類,我們可以new Request對象,來參與測試,太方便了。給request指定訪問的URL,就可以請求目標Action了。

 

Java代碼  收藏代碼

  1. package test.com.app.user;  

  2. import org.junit.Assert;  

  3. import org.junit.Test;  

  4. import org.springframework.mock.web.MockHttpServletRequest;  

  5. import org.springframework.mock.web.MockHttpServletResponse;  

  6. import org.springframework.web.servlet.ModelAndView;  

  7.   

  8. import test.JUnitActionBase;  

  9.   

  10. /**  

  11. * 說明: 測試OrderAction的例子 

  12.  

  13. * @author  趙磊  

  14. * @version 創建時間:2011-2-2 下午10:26:55   

  15. */   

  16.   

  17. public class TestOrderAction extends JUnitActionBase {  

  18.     @Test  

  19.     public void testAdd() throws Exception {  

  20.     MockHttpServletRequest request = new MockHttpServletRequest();  

  21.         MockHttpServletResponse response = new MockHttpServletResponse();  

  22.         request.setServletPath("/order/add");  

  23.         request.addParameter("id""1002");  

  24.         request.addParameter("date""2010-12-30");  

  25.         request.setMethod("POST");  

  26.         // 執行URI對應的action  

  27.         final ModelAndView mav = this.excuteAction(request, response);  

  28.         // Assert logic  

  29.         Assert.assertEquals("order/add", mav.getViewName());  

  30.         String msg=(String)request.getAttribute("msg");  

  31.         System.out.println(msg);  

  32.     }  

  33. }  

 需要說明一下 :由於當前最想版本的Spring(Test) 3.0.5還不支持@ContextConfiguration的註解式context file注入,所以還需要寫個setUp處理下,否則類似於Tiles的加載過程會有錯誤,因爲沒有ServletContext。3.1的版本應該有更好的解決方案,

參見: https://jira.springsource.org/browse/SPR-5243 

參考 :http://www.iteye.com/topic/828513


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章