MockMVC 理论基础
简介
在面向对象程序设计中,模拟对象(mock object)是以可控的方式模拟真实对象行为的假的对象。比如:对象B依赖于对象A,但是A代码还没写,是一个空类,空方法不能用,我们来mock一个假的A来完成测试。
在单元测试中,模拟对象可以模拟复杂的、真实的对象的行为, 如果真实的对象无法放入单元测试中,使用模拟对象就很有帮助。
在下面的情形中,可能需要使用模拟对象来代替真实对象:
- 真实对象的行为是不确定的(例如,当前的时间或当前的温度);
- 真实对象很难搭建起来;
- 真实对象的行为很难触发(例如,网络错误);
- 真实对象速度很慢(例如,一个完整的数据库,在测试之前可能需要初始化);
- 真实的对象是用户界面,或包括用户界面在内;
- 真实的对象使用了回调机制;
- 真实对象可能还不存在(例如,其他程序员还为完成工作);
- 真实对象可能包含不能用作测试的信息(高度保密信息等)和方法。
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
因为在做系统的自动化持续集成的时候,会要求自动的做单元测试,只有所有的单元测试都跑通了,才能打包构建。比如:使用maven。这里重点是自动化,所以postman这种工具很难插入到持续集成的自动化流程中去。所以需要我们自己写代码完成单元测试。另外写代码测试能模拟出更多复杂的测试场景,类似Postman工具只能完成简单的接口测试。
原理:使用MockMvc发起请求,然后执行相应的代码,在执行的过程中使用Mockito的mock模拟底层数据的返回,最后结果验证。
相关API
MockMvcBuilders
MockMvcBuilders用来构造MockMvc的构造器,其主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分别对应两种测试方式,即独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。对于我们来说直接使用静态工厂MockMvcBuilders创建即可。
- public static DefaultMockMvcBuilder webAppContextSetup(WebApplicationContext context)
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
MockMvcRequestBuilders通过方法得到两类Builder,一个是MockHttpServletRequestBuilder ,一个是MockMultipartHttpServletRequestBuilder (上传文件)
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 param(String name,String… values)
请求传入参数 - 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)
请求的后处理器,用于自定义一些请求处理的扩展点
MockMultipartHttpServletRequestBuilder
MockMultipartHttpServletRequestBuilder继承自MockHttpServletRequestBuilder,提供了如下API:
- MockMultipartHttpServletRequestBuilder file(String name, byte[] content)
- MockMultipartHttpServletRequestBuilder file(MockMultipartFile file)
指定要上传的文件
ResultActions:
调用MockMvc.perform(RequestBuilder requestBuilder)后将得到ResultActions,通过ResultActions可以完成如下三件事:
- ResultActions andExpect(ResultMatcher matcher)
添加验证断言,用来判断执行请求后的结果是否是预期的 - ResultActions andDo(ResultHandler handler)
添加结果处理器,用于设置验证成功后执行的动作,如输出下请求/结果信息用于调试 - MvcResult andReturn()
返回验证成功后的MvcResult;用于自定义验证/下一步的异步处理
ResultMatcher/MockMvcResultMatchers:
ResultMatcher用来匹配执行完请求后的结果验证,其就一个match(MvcResult result)断言方法,如果匹配失败将抛出相应的异常;具体提供以下API:
- HandlerResultMatchers handler()
请求的Handler验证器,比如验证处理器类型/方法名;此处的Handler其实就是处理请求的控制器 - RequestResultMatchers request()
得到RequestResultMatchers验证器 - ModelResultMatchers model()
得到模型验证器 - ViewResultMatchers view()
得到视图验证器 - FlashAttributeResultMatchers flash()
得到Flash属性验证 - StatusResultMatchers status()
得到响应状态验证器 - HeaderResultMatchers header()
得到响应Header验证器 - CookieResultMatchers cookie()
得到响应Cookie验证器 - ContentResultMatchers content()
得到响应内容验证器 - JsonPathResultMatchers jsonPath(String expression, Object … args)
- ResultMatcher jsonPath(String expression, Matcher matcher)
得到Json表达式验证器 - XpathResultMatchers xpath(String expression, Object… args)
- XpathResultMatchers xpath(String expression, Map<string, string=“”> namespaces, Object… args)
得到Xpath表达式验证器 - ResultMatcher forwardedUrl(final String expectedUrl)
验证处理完请求后转发的url(绝对匹配 - ResultMatcher forwardedUrlPattern(final String urlPattern)
验证处理完请求后转发的url(Ant风格模式匹配,@since spring4) - ResultMatcher redirectedUrl(final String expectedUrl)
验证处理完请求后重定向的url(绝对匹配) - ResultMatcher redirectedUrlPattern(final String expectedUrl)
验证处理完请求后重定向的url(Ant风格模式匹配,@since spring4)
MockMVC 理论基础相关推荐
- 【转载】图像缩放与插值理论基础
图像的缩放 图像经过缩放后有可能在原图中招不到对应的像素点,这需要用图像插值来解决. 1.理论基础 假设图像的X轴方向缩放比例是Kx,Y轴方向的缩放比是Ky,则缩放后输出图像的点(x' , y')对应 ...
- 机器学习理论基础到底有多可靠?
机器学习领域近年的发展非常迅速,然而我们对机器学习理论的理解还很有限,有些模型的实验效果甚至超出了我们对基础理论的理解. 目前,领域内越来越多的研究者开始重视和反思这个问题.近日,一位名为 Aidan ...
- 信息理论基础 周炯槃 常迥
通信的数学原理 作者 乡农 https://wenku.baidu.com/view/080af641ddccda38376baf4e.html 信息理论是应用十分广泛的基础学科.它随着通讯技术的 ...
- 人大魏哲巍:图神经网络的理论基础
[专栏:研究思路]近年来,由于图结构数据的强大表现力,用机器学习方法分析图的研究越来越受到重视.图神经网络是一类基于深度学习的处理图结构数据的方法,在众多领域展现出了卓越的性能,因此已成为一种广泛应用 ...
- 魏哲巍:图神经网络的理论基础 | 青源 Talk 第 7 期
活动议程 日期:11月12日(周五) 时间 主题 13:30-13:35 开场简介 张峰 中国人民大学副教授,青源会会员 13:35-14:20 主题:图神经网络的理论基础 魏哲巍 中国人民大学教授, ...
- 汪昭然:构建“元宇宙”和理论基础,让深度强化学习从虚拟走进现实
作者 | 陈彩娴 深度强化学习的故事,可以追溯到2015年: 当时,位于英国伦敦的一家小公司 DeepMind 在<Nature>上发表了一篇文章"Human-level con ...
- 从2019 AI顶会最佳论文,看深度学习的理论基础
2020-01-27 13:15:38 如果能有一种理论告诉我们什么样的模型架构.运算方式能最好地表示某种数据,什么样的损失函数.迭代方式能最高效地学习到某种能力,什么样的设置又使这种能力能处理各种意 ...
- 科普丨可拓学,诞生于中国的人工智能的理论基础之一
[作者简介] 蔡 文,1942 年生,广东澄海人,广东工业大学研究员, 可拓学创立者,国家级有突出贡献的专家 杨春燕,1964 年生,山东泰安人,研究员,中国人工智能学会可拓工程专业委员会副主任 可 ...
- 城市大脑的定义与理论基础综述
本文发表于2022年·2月下旬的<中国建设信息化>,作者杜青峰 刘锋 任伟阳 1 前言 2015以来,城市大脑的概念和定义首次提出后.随着城市大脑领域在理论研究和产业实践上的探索和进展 ...
最新文章
- 经验 | Pytorch还是Tensorflow?英伟达工程师帮你总结了
- 解决Linux最大进程数和最大文件句柄问题
- 自然语言处理之机器处理流程
- FLEX 动态添加事件
- Pycharm中导入的模块名下出现红色波浪线问题
- 网工路由基础(1)静态路由
- 学习OpenResty编程
- oracle表对比同步,Oracle表双向同步问题
- 学文科的优势_男生学文科有优势吗?
- 最新前端中高级面试题
- mysql 忘记密码解决方法(有用)
- 0. PSR-0 --- 自动加载
- 组成原理说明------地址对齐
- 深山红叶PE系统工具箱V32
- 2019年考研篇(2020毕业)
- vs2013 update5离线升级包下载地址
- 使用python给微信推送信息(一)
- 使用HBuilder打包App教程(图文教程)
- postgreSQL安装成功后打开pgadmin4出现错误:Fatal error:The pgAdmin 4 server could not be contacted:
- 某悦的WinRT学习记录1