Spring MVC测试框架详解――服务端测试(八)

2014-11-24 03:11:22 · 作者: · 浏览: 2
; Assert.assertTrue(HttpMessageNotReadableException.class.isAssignableFrom(result.getResolvedException().getClass()));//错误的请求内容体

异常处理

        //异常处理
        MvcResult result = mockMvc.perform(get(/user/exception)) //执行请求
                .andExpect(status().isInternalServerError()) //验证服务器内部错误
                .andReturn();

        Assert.assertTrue(IllegalArgumentException.class.isAssignableFrom(result.getResolvedException().getClass()));

静态资源

        //静态资源
        mockMvc.perform(get(/static/app.js)) //执行请求
                .andExpect(status().isOk()) //验证状态码200
                .andExpect(content().string(CoreMatchers.containsString(var)));//验证渲染后的视图内容包含var

        mockMvc.perform(get(/static/app1.js)) //执行请求
                .andExpect(status().isNotFound());  //验证状态码404

异步测试

        //Callable
        MvcResult result = mockMvc.perform(get(/user/async1 id=1&name=zhang)) //执行请求
                .andExpect(request().asyncStarted())
                .andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class))) //默认会等10秒超时
                .andReturn();

        mockMvc.perform(asyncDispatch(result))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
                .andExpect(jsonPath($.id).value(1));
        //DeferredResult
        result = mockMvc.perform(get(/user/async2 id=1&name=zhang)) //执行请求
                .andExpect(request().asyncStarted())
                .andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class)))  //默认会等10秒超时
                .andReturn();

        mockMvc.perform(asyncDispatch(result))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
                .andExpect(jsonPath($.id).value(1));

此处请在第一次请求时加上 andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class)))这样会等待结果返回/超时,无须自己设置线程等待了;此处注意request().asyncResult一定是在第一次请求发出;然后第二次通过asyncDispatch进行异步请求。

添加自定义过滤器

        mockMvc = webAppContextSetup(wac).addFilter(new MyFilter(), /*).build();
        mockMvc.perform(get(/user/1))
                .andExpect(request().attribute(filter, true));

全局配置

        mockMvc = webAppContextSetup(wac)
                .defaultRequest(get(/user/1).requestAttr(default, true)) //默认请求 如果其是Mergeable类型的,会自动合并的哦mockMvc.perform中的RequestBuilder
                .alwaysDo(print())  //默认每次执行请求后都做的动作
                .alwaysExpect(request().attribute(default, true)) //默认每次执行后进行验证的断言
                .build();

        mockMvc.perform(get(/user/1))
                .andExpect(model().attributeExists(user));

以上代码请参考 我的github。更多参考示例请 前往Spring github。

只要记住测试步骤,按照步骤操作,整个测试过程是非常容易理解的:

1、准备测试环境

2、通过MockMvc执行请求

3.1、添加验证断言

3.2、添加结果处理器

3.3、得到MvcResult进行自定义断言/进行下一步的异步请求

4、卸载测试环境

对于单元测试步骤请参考:加速Java应用开发速度3——单元/集成测试+CI。