博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring MVC 单元调试和访问
阅读量:5969 次
发布时间:2019-06-19

本文共 4298 字,大约阅读时间需要 14 分钟。

  hot3.png

如何给spring3 MVC中的Action做JUnit单元测试?
整理自:http://www.cnblogs.com/weipeng/archive/2012/03/27/2420009.html#2562500
使用了spring3 MVC后,给action做单元测试也很方便,我以前从来不给action写单元测试的,再在不同了,方便了,所以一定要写。
JUnitActionBase类是所有JUnit的测试类的父类
Java代码
    package test;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
    import org.junit.BeforeClass;  
    import org.springframework.mock.web.MockServletContext;  
    import org.springframework.web.context.WebApplicationContext;  
    import org.springframework.web.context.support.XmlWebApplicationContext;  
    import org.springframework.web.servlet.HandlerAdapter;  
    import org.springframework.web.servlet.HandlerExecutionChain;  
    import org.springframework.web.servlet.HandlerMapping;  
    import org.springframework.web.servlet.ModelAndView;  
    import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;  
    import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping;  
    /**  
    * 说明: JUnit测试action时使用的基类
    *  
    * @author  赵磊
    * @version 创建时间:2011-2-2 下午10:27:03   
    */   
    public class JUnitActionBase {  
        private static HandlerMapping handlerMapping;  
        private static HandlerAdapter handlerAdapter;  
        /**
         * 读取spring3 MVC配置文件
         */  
        @BeforeClass  
     public static void setUp() {  
            if (handlerMapping == null) {  
                String[] configs = { "file:src/springConfig/springMVC.xml" };  
                XmlWebApplicationContext context = new XmlWebApplicationContext();  
                context.setConfigLocations(configs);  
                MockServletContext msc = new MockServletContext();  
                context.setServletContext(msc);         context.refresh();  
                msc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);  
                handlerMapping = (HandlerMapping) context  
                        .getBean(DefaultAnnotationHandlerMapping.class);  
                handlerAdapter = (HandlerAdapter) context.getBean(context.getBeanNamesForType(AnnotationMethodHandlerAdapter.class)[0]);     
            }  
        }  
      
        /**
         * 执行request对象请求的action
         *  
         * @param request
         * @param response
         *
         * @throws Exception
         */  
        public ModelAndView excuteAction(HttpServletRequest request, HttpServletResponse response)  
     throws Exception {  
            HandlerExecutionChain chain = handlerMapping.getHandler(request);  
            final ModelAndView model = handlerAdapter.handle(request, response,  
                    chain.getHandler());  
            return model;  
        }  
    }   
这是个JUnit测试类,我们可以new Request对象,来参与测试,太方便了。给request指定访问的URL,就可以请求目标Action了。
Java代码
    package test.com.app.user;  
    import org.junit.Assert;  
    import org.junit.Test;  
    import org.springframework.mock.web.MockHttpServletRequest;  
    import org.springframework.mock.web.MockHttpServletResponse;  
    import org.springframework.web.servlet.ModelAndView;  
    import test.JUnitActionBase;  
      
    /**  
    * 说明: 测试OrderAction的例子
    *  
    * @author  赵磊  
    * @version 创建时间:2011-2-2 下午10:26:55   
    */   
      
    public class TestOrderAction extends JUnitActionBase {  
         
        public void testAdd() throws Exception {  
        MockHttpServletRequest request = new MockHttpServletRequest();  
            MockHttpServletResponse response = new MockHttpServletResponse();  
            request.setRequestURI("/order/add");  
            request.addParameter("id", "1002");  
            request.addParameter("date", "2010-12-30");  
            request.setMethod("POST");  
            // 执行URI对应的action  
            final ModelAndView mav = this.excuteAction(request, response);  
            // Assert logic  
            Assert.assertEquals("order/add", mav.getViewName());  
            String msg=(String)request.getAttribute("msg");  
            System.out.println(msg);  
        }  
    }  
需要说明一下 : 由于当前最想版本的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

转发与重定向
可以通过redirect/forward:url方式转到另一个Action进行连续的处理。
可以通过redirect:url 防止表单重复提交 。
写法如下:
return "forward:/order/add";
return "redirect:/index.jsp";
处理ajax请求
1、引入下面两个jar包,我用的是1.7.2,好像1.4.2版本以上都可以,下载地址: http://wiki.fasterxml.com/JacksonDownload
jackson-core-asl-1.7.2.jar
jackson-mapper-asl-1.7.2.jar
2、spring的配置文件中要有这一行,才能使用到spring内置支持的json转换。如果你手工把POJO转成json就可以不须要使用spring内置支持的json转换。
<mvc:annotation-driven />
3、使用@ResponseBody注解
Java代码
    /**
     * ajax测试
     * http://127.0.0.1/mvc/order/ajax
     */  
    @RequestMapping("/ajax")  
    @ResponseBody  
    public Object ajax(HttpServletRequest request){  
        List<String> list=new ArrayList<String>();  
        list.add("电视");  
        list.add("洗衣机");  
        list.add("冰箱");  
        list.add("电脑");  
        list.add("汽车");  
        list.add("空调");  
        list.add("自行车");  
        list.add("饮水机");  
        list.add("热水器");  
        return list;  
    } 

转载于:https://my.oschina.net/boonya/blog/92082

你可能感兴趣的文章
批处理文件学习笔记
查看>>
[考试]20151008
查看>>
perf-perf stat用户层代码分析
查看>>
OSI七层与TCP/IP五层网络架构详解
查看>>
(转载)equals与==
查看>>
shell
查看>>
Centos防火墙添加IP白名单
查看>>
LeetCode - Backspace String Compare
查看>>
namespace用法
查看>>
MySQL 5.7原生JSON格式支持
查看>>
[吴恩达机器学习笔记]14降维3-4PCA算法原理
查看>>
Solr分词
查看>>
二十四种设计模式:策略模式(Strategy Pattern)
查看>>
统计某个字符串中指定字符串出现的次数
查看>>
asp.net三层结构中,SQL助手类DbHelperSQL
查看>>
scala map和flatMap
查看>>
.Net Core下使用 RSA
查看>>
python 数据库中文乱码 Excel
查看>>
利用console控制台调试php代码
查看>>
递归算法,如何把list中父子类对象递归成树
查看>>