spring mvc 单元测试

最近在写单元测试,遇到一些坑和你们分享一下。 
以前咱们一直有service层的单元测试,可是没有action层的单元测试,正好咱们用到spring mvc,因此就用了spring-test作单元测试, 
spring mvc 的单元测试,spring-test是使用mock实现的,提供了 MockHttpServletResponse,MockHttpServletRequest对象,都是经过 javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse 模拟出来的。
一、同步调用 
 server端controller代码:
    @RequestMapping(value = "/mobile/ios/test", method = RequestMethod.GET)
    @ResponseBody
    public String test(HttpServletRequest request, final HttpServletResponse response) {
        return "sdfsdf";
    }
client test 的代码:
    @Test
    public void test() throws Exception {
         mockMvc.perform(MockMvcRequestBuilders.get("/mobile/ios/test") )
          .andExpect(MockMvcResultMatchers.status().isOk())
          .andDo(MockMvcResultHandlers.print()).andReturn();
    }
二、异步调用
 server端controller代码:
@RequestMapping(value = "/mobile/ios/testAsyn", method = RequestMethod.GET)
    @ResponseBody
    public Callable<String> testAsyn(HttpServletRequest request, final HttpServletResponse response) {
        return new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "sdfsdf";
            }
        };
}
client test 的代码:
    @Test
    public void testAysn() throws Exception {
        MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.get("/mobile/ios/testAsyn").header("X-BlueWare-Connect-Time", 1000 * 30))
                .andExpect(MockMvcResultMatchers.request().asyncStarted()).andReturn();
        mvcResult.getAsyncResult();
 mockMvc.perform(MockMvcRequestBuilders.asyncDispatch(mvcResult)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
    }
说一下坑的位置:
一、同步的 controller 用同步的方法测试,好比(get,post,fileUpload,delete),异步的方法用异步测试,好比(Callable ,用asyncDispatch)。这个说不上是否是bug。按正常思惟的话,若是服务端是异步的化,客户端用异步,同步都是能够的,这个作的比较怪异。 也是回答Willem Jiang 老师的问题(讨论这个是否是bug)。
二、若是用同步的Test 测试异步的服务(Callable)会遇到什么问题,由于客户端没有设置timeToWait,因此根本就没有等待Callable 的返回值,Test的全部状态都是正常,就算是在Callable里抛异常也没用,也没有办法对Callable进行Debug,由于 timeToWait默认为0,一闪就过去了,这个也是我最开始比较郁闷的地方。
三、就算是用asyncDispatch,进行也有问题。”.asyncStarted()“一 定要设置,这个是告诉request请求,是异步请求。
四、getAsyncResult()也是一个坑,若是不调用这个方法,asyncDispatch也有问题,由于 timeToWait 默认为0,直接报错!这时候你说了,我服务器端有设置呀,<mvc:async-support default-timeout="3000" />
这个选项是配置服务端请求超时的,可是我告诉你,若是没有调用getAsyncResult()方法,服务端的这个配置是没有用的。
getAsyncResult(),是一个重载的方法,有一个带参数的,一个不带参数的,若是不带参数,用的是服务端配置  mvc:async-support ,若是带参数, 则为客户端参数的时间(单位毫秒)。java

相关文章
相关标签/搜索