MockMvc- SpringMVC单元测试的独立测试:
一.个人资料
为什么要使用MockMvc?
集成测试模块时,最好能输入URL测试控制器。 启动服务器并构建和测试http客户端时,由于启动速度慢、测试验证不方便、依赖网络环境等测试很麻烦,为了能够测试控制器,引入了MockMVC。
MockMvc实现了Http请求的模拟,可以直接使用网络的形式转换为控制器的调用。 这为测试速度快、独立于网络环境以及统一和方便请求验证提供了一系列验证工具。
二.测试逻辑
MockMvcBuilder构建MockMvc的构造函数;
mockMvc调用perform,执行请求构建器请求,并调用控制器业务处理逻辑;
perform返回结果动作,返回操作结果,通过结果动作,提供了统一的验证方式;
使用StatusResultMatchers验证请求结果;
使用ContentResultMatchers验证请求返回的内容;
三. MockMvcBuilder
MockMvc是在spring测试下非常容易使用的类,他们的初始化必须在setUp中进行。
MockMvcBuilder是构建MockMvc的构造函数,主要有两种实现。 是StandaloneMockMvcBuilder和DefaultMockMvcBuilder,前者继承后者。
指定mockmvcbuilders.webappcontextsetup (webapplicationcontextcontext ) ),从该上下文中获取相应的控制器,然后单击相应的mockmvc;
通过在mockmvcbuilders.standalone setup (object . controllers )参数中指定一组控制器,无需从上下文中获取。 例如this.mockmvcbuilders.standalders ) )。
这些Builder还提供其他api,可以自己百度
四. MockMvcRequestBuilders
从名称中可以看到,请求构建器用于构建请求,并提供构建MockHttpServletRequest的方法构建请求(servlet context,服务上下文)。 主要有两个子类MockHttpServletRequestBuilder和mockmultiparthttpservletrequestbuilder。 这意味着它用于请求mock客户端所需的所有数据。
主要API :
mockhttpservletrequestbuilderget (stringurltemplate, Object. urlVariables ) :根据uri模板和uri变量的值获取get请求方式的requestbuilder,如果method在controller的方法中选择了RequestMethod.GET,则
POST(stringURLtemplate,Object. urlVariables ) :与get类似,但为post方法;
PUT(stringURLtemplate,Object. urlVariables ) :与get类似,但为put方法;
elete(stringURLtemplate,Object. urlVariables ) :与get类似,但为DELETE方法;
OPTIONS(stringURLtemplate,Object. urlVariables ) :与get类似,但为options方法;
五.结果动作
调用mock MVC.perform (requestbuilderrequestbuilder )可获得结果操作。 结果动作有三种处理方式:
ResultActions.andExpect :添加执行完成后的断言。 添加ResultMatcher验证规则,在控制器运行完成后验证结果正确;
ResultActions.andDo :其中添加调试时可用的结果处理程序,如使用. anddo (mockmvcresulthandlers.print ) )打印整个响应结果信息。
ResultActions.andReturn :表示执行已完成并返回相应的结果
评论:
ResultHandler用于正确处理处理结果,如输出整个请求/响应等信息以方便调试,并由Spring mvc测试框架提供
了MockMvcResultHandlers静态工厂方法,该工厂提供了ResultHandler print()返回一个输出MvcResult详细信息到控制台的ResultHandler实现例子:
String example= "{"id":1, "name":"kqzu"}"; mockMvc.perform(post("/user") // 路径 .contentType(MediaType.APPLICATION_JSON) //用contentType表示具体请求中的媒体类型信息,MediaType.APPLICATION_JSON表示互联网媒体类型的json数据格式(见备注) .content(example) .accept(MediaType.APPLICATION_JSON)) //accept指定客户端能够接收的内容类型 .andExpect(content().contentType("application/json;charset=UTF-8")) //验证响应contentType == application/json;charset=UTF-8 .andExpect(jsonPath("$.id").value(1)) //验证id是否为1,jsonPath的使用 .andExpect(jsonPath("$.name).value("kqzhu"); // 验证name是否等于ZhukeqianString errorExample = "{"id":1, "name":"kqzhu"}"; MvcResult result = mockMvc.perform(post("/user") .contentType(MediaType.APPLICATION_JSON) .content(errorExample) .accept(MediaType.APPLICATION_JSON)) //执行请求 .andExpect(status().isBadRequest()) //400错误请求, status().isOk() 正确 status().isNotFound() 验证控制器不存在 .andReturn(); //返回MvcResult 备注:使用Content-type来指定不同格式的请求信息,下面例举在日常的开发中,常会用的若干content-type的内容格式 例如: Content-Type: text/html;charset:utf-8;
常见的媒体格式类型如下:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式 /
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
以application开头的媒体格式类型:
application/xhtml+xml :XHTML格式
application/xml : XML数据格式
application/atom+xml :Atom XML聚合格式
application/json : JSON数据格式
application/pdf :pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
附录:Requests & Responses 的标识及解释
六、ResultMatchers
ResultMatcher用来匹配执行完请求后的结果验证,其就一个match(MvcResult result)断言方法,如果匹配失败将抛出相应的异常,spring mvc测试框架提供了很多***ResultMatchers来满足测试需求。
具体请百度。
七、MvcResult
即执行完控制器后得到的整个结果,并不仅仅是返回值,其包含了测试时需要的所有信息。
MockHttpServletRequest getRequest():得到执行的请求;
MockHttpServletResponse getResponse():得到执行后的响应;
Object getHandler():得到执行的处理器,一般就是控制器;
HandlerInterceptor[] getInterceptors():得到对处理器进行拦截的拦截器;
ModelAndView getModelAndView():得到执行后的ModelAndView;
Exception getResolvedException():得到HandlerExceptionResolver解析后的异常;
FlashMap getFlashMap():得到FlashMap;
Object getAsyncResult()/Object getAsyncResult(long timeout):得到异步执行的结果;
资料:史上最全,Spring MVC测试框架详解——服务端测试
原文:https://blog.csdn.net/kqZhu/article/details/78836275