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


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