如何给Spring3 MVC中的Action做JUnit单元测试?

开发 架构
使用了spring3 MVC后,给action做单元测试也很方便,我以前从来不给action写单元测试的,再在不同了,方便了,所以一定要写。

使用了spring3 MVC后,给action做单元测试也很方便,我以前从来不给action写单元测试的,再在不同了,方便了,所以一定要写。

 

JUnitActionBase类是所有JUnit的测试类的父类

  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. }    

更多关系Spring的信息

Spring 论坛  http://www.itchm.com/forum-59-1.html

这是个JUnit测试类,我们可以new Request对象,来参与测试,太方便了。给request指定访问的URL,就可以请求目标Action了。

  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.setRequestURI("/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的版本应该有更好的解决方案。

原文链接:http://www.cnblogs.com/ajuanabc/archive/2012/07/21/2601867.html

责任编辑:林师授 来源: 博客园
相关推荐

2011-08-11 13:02:43

Struts2Junit

2017-01-16 12:12:29

单元测试JUnit

2017-01-14 23:26:17

单元测试JUnit测试

2021-01-07 14:06:30

Spring BootJUnit5Java

2021-08-26 11:00:54

Spring BootJUnit5Java

2011-11-18 15:18:41

Junit单元测试Java

2022-05-09 08:55:52

ORMMockGo

2019-12-18 10:25:12

机器学习单元测试神经网络

2021-09-18 15:40:03

Vue单元测试命令

2012-05-17 09:09:05

Titanium单元测试

2009-06-08 20:04:06

EclipseJUnit4单元测试

2009-07-24 11:33:12

MVC单元测试ASP.NET

2021-04-23 07:33:10

SpringSecurity单元

2013-06-04 09:49:04

Spring单元测试软件测试

2012-02-07 09:08:50

Feed4JUnitJava

2017-01-14 23:42:49

单元测试框架软件测试

2020-07-21 14:40:45

Spring Boot单元测试Java

2021-09-01 12:03:49

Spring单元测试

2011-04-18 13:20:40

单元测试软件测试

2020-09-30 08:08:15

单元测试应用
点赞
收藏

51CTO技术栈公众号