QQ图片20210121204825.jpg

MockMvc详解

MockMvc是什么

简单来说,对于web应用来讲,你需要对你的各个模块进行测试,但是通过启动项目使用postman来测试的话比较麻烦(程序启动速度慢,测试验证不方便,依赖网络环境),那么为了使我们的单元测试更加简单、高效,我们引入了MockMvc

MockMvc实现了对于Http请求的模拟,能够直接使用网络的形式,转换到contoller的调用,可以使得测试速度快、不依赖网络环境,而且还提供了专门的一套验证的工具。

测试的逻辑

  1. MockMvcBuilder构造MockMvc的构造器
  2. MockMvc调用perform,执行一个RequestBuilder请求,调用controller的业务处理逻辑
  3. perform返回ResultActions,返回操作的结果,通过ResultActions,提供了统一的验证方式
  4. 使用StatusResultMatchers对请求结果进行验证
  5. 使用ContentResultMatchers对请求的内容进行验证

如何获取mockMvc实例

两个获取mockMvc实例的方式:

  • StandaloneMockMvcBuilder
  • DefaultMockMvcBuilder

具体实现方式:

  1. MockMvcBuilders.webAppContextSetup(WebApplicationContext context)

指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc

  1. MockMvcBuilders.standaloneSetup(Object... controllers)

通过参数指定一组控制器,这样就不需要从上下文获取了

比如this.mockMvc = MockMvcBuilders.standaloneSetup(this.controller).build();

## 构造请求——MockMvcRequestBuilders

构造请求示例:MockMvcRequestBuilders.get("/user")

MockMvcRequestBuilders主要API

MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据uri模板和uri变量值得到一个GET请求方式的MockHttpServletRequestBuilder;如get(/user/{id}, 1L);

MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables):同get类似,但是是POST方法;

MockHttpServletRequestBuilder put(String urlTemplate, Object... urlVariables):同get类似,但是是PUT方法;

MockHttpServletRequestBuilder delete(String urlTemplate, Object... urlVariables) :同get类似,但是是DELETE方法;

MockHttpServletRequestBuilder options(String urlTemplate, Object... urlVariables):同get类似,但是是OPTIONS方法;

MockHttpServletRequestBuilder request(HttpMethod httpMethod, String urlTemplate, Object... urlVariables): 提供自己的Http请求方法及uri模板和uri变量,如上API都是委托给这个API;

MockMultipartHttpServletRequestBuilder fileUpload(String urlTemplate, Object... urlVariables):提供文件上传方式的请求,得到MockMultipartHttpServletRequestBuilder;

RequestBuilder asyncDispatch(final MvcResult mvcResult):创建一个从启动异步处理的请求的MvcResult进行异步分派的RequestBuilder;

指定请求参数——MockHttpServletRequestBuilder

当然,我们不仅可以设置它的请求方式,同样也可以设置它的请求参数

MockHttpServletRequestBuilder主要API

MockHttpServletRequestBuilder header(String name, Object... values)/MockHttpServletRequestBuilder headers(HttpHeaders httpHeaders):添加头信息;

MockHttpServletRequestBuilder contentType(MediaType mediaType):指定请求的contentType头信息;

MockHttpServletRequestBuilder accept(MediaType... mediaTypes)/MockHttpServletRequestBuilder accept(String... mediaTypes):指定请求的Accept头信息;

MockHttpServletRequestBuilder content(byte[] content)/MockHttpServletRequestBuilder content(String content):指定请求Body体内容;

MockHttpServletRequestBuilder cookie(Cookie... cookies):指定请求的Cookie;

MockHttpServletRequestBuilder locale(Locale locale):指定请求的Locale;

MockHttpServletRequestBuilder characterEncoding(String encoding):指定请求字符编码;

MockHttpServletRequestBuilder requestAttr(String name, Object value) :设置请求属性数据;

MockHttpServletRequestBuilder sessionAttr(String name, Object value)/MockHttpServletRequestBuilder sessionAttrs(Map<string, object=""> sessionAttributes):设置请求session属性数据;

MockHttpServletRequestBuilder flashAttr(String name, Object value)/MockHttpServletRequestBuilder flashAttrs(Map<string, object=""> flashAttributes):指定请求的flash信息,比如重定向后的属性信息;

MockHttpServletRequestBuilder session(MockHttpSession session) :指定请求的Session;

MockHttpServletRequestBuilder principal(Principal principal) :指定请求的Principal;

MockHttpServletRequestBuilder contextPath(String contextPath) :指定请求的上下文路径,必须以“/”开头,且不能以“/”结尾;

MockHttpServletRequestBuilder pathInfo(String pathInfo) :请求的路径信息,必须以“/”开头;

MockHttpServletRequestBuilder secure(boolean secure):请求是否使用安全通道;

MockHttpServletRequestBuilder with(RequestPostProcessor postProcessor):请求的后处理器,用于自定义一些请求处理的扩展点;

ResultActions

在请求体全部构建完成之后,我们就要针对响应的内容做断言,来验证我们测试的有效性

通过调用MockMvc.perform()之后会返回一个ResultActions对象,通过ResultActions我们可以做以下三件事:

  1. ResultActions andExpect(ResultMatcher matcher) :添加验证断言来判断执行请求后的结果是否是预期的;
  2. ResultActions andDo(ResultHandler handler) :添加结果处理器,用于对验证成功后执行的动作,如输出下请求/结果信息用于调试;
  3. MvcResult andReturn() :返回验证成功后的MvcResult;用于自定义验证/下一步的异步处理;
Last modification:January 21st, 2021 at 08:48 pm