SpringBoot使用MockMVC单元测试Controller

对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如启动速度慢,测试验证不方便,依赖网络环境等,这样会导致测试无法进行,为了可以对Controller进行测试,可以通过引入MockMVC进行解决

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

MockMvcBuilder是用来构造MockMvc的构造器,其主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分别对应两种测试方式,即独立安装集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。对于我们来说直接使用静态工厂MockMvcBuilders创建即可。

下面就写一个简单的案例,告诉你是如何使用MockMvc进行Controller测试的

01 创建项目

创建一个Maven项目(springboot-junit),并配置pom.xml,参照下面代码:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.lvgang</groupId><artifactId>springboot-junit</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>springboot-junit</name><url>http://maven.apache.org</url><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies></project>

创建一个Controller类,我们在后面就测试空上Controller

图片

02 编写测试类

下面我们就是编写测试类了:

package org.lvgang;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.http.MediaType;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.test.context.web.WebAppConfiguration;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.result.MockMvcResultHandlers;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import org.springframework.web.context.WebApplicationContext;//SpringBoot1.4版本之前用的是SpringJUnit4ClassRunner.class@RunWith(SpringRunner.class)//SpringBoot1.4版本之前用的是@SpringApplicationConfiguration(classes = Application.class)@SpringBootTest(classes = App.class)//测试环境使用,用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的@WebAppConfigurationpublic class HelloControllerTest {    @Autowiredprivate WebApplicationContext webApplicationContext;    private MockMvc mockMvc;    @Beforepublic void setUp() throws Exception{      //MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvcmockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();//建议使用这种}    @Testpublic void getHello() throws Exception{        /*** 1、mockMvc.perform执行一个请求。* 2、MockMvcRequestBuilders.get("XXX")构造一个请求。* 3、ResultActions.param添加请求传值* 4、ResultActions.accept(MediaType.TEXT_HTML_VALUE))设置返回类型* 5、ResultActions.andExpect添加执行完成后的断言。* 6、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情*   比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。* 5、ResultActions.andReturn表示执行完成后返回相应的结果。*/MvcResult mvcResult= mockMvc.perform(MockMvcRequestBuilders.get("/").param("name","lvgang").accept(MediaType.TEXT_HTML_VALUE))              // .andExpect(MockMvcResultMatchers.status().isOk())             //等同于Assert.assertEquals(200,status);// .andExpect(MockMvcResultMatchers.content().string("hello lvgang"))    //等同于 Assert.assertEquals("hello lvgang",content);.andDo(MockMvcResultHandlers.print()).andReturn();        int status=mvcResult.getResponse().getStatus();                 //得到返回代码String content=mvcResult.getResponse().getContentAsString();    //得到返回结果Assert.assertEquals(200,status);                        //断言,判断返回代码是否正确Assert.assertEquals("hello lvgang",content);            //断言,判断返回的值是否正确}
}

整个测试过程如下:

  • 准备测试环境

  • 通过MockMvc执行请求

  • 添加验证断言

  • 添加结果处理器

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

  • 卸载测试环境

03 测试结果

通过执行HelloControllerTest,得到以下结果:

图片

并且把整个返回结果都打印到了Console中

MockHttpServletRequest:HTTP Method = GETRequest URI = /Parameters = {name=[lvgang]}Headers = {Accept=[text/html]}Handler:Type = org.lvgang.HelloControllerMethod = public java.lang.String org.lvgang.HelloController.hello(java.lang.String)Async:Async started = falseAsync result = nullResolved Exception:Type = nullModelAndView:View name = nullView = nullModel = nullFlashMap:Attributes = nullMockHttpServletResponse:Status = 200Error message = nullHeaders = {Content-Type=[text/html;charset=UTF-8], Content-Length=[12]}Content type = text/html;charset=UTF-8Body = hello lvgangForwarded URL = nullRedirected URL = nullCookies = []

通过以上代码,我们就完成了一个简单的案例。

附:

RequestBuilder/MockMvcRequestBuilders:

在上面的测试类中,我们用到了这么一个类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;MockMultipartHttpServletRequestBuilderfile Upload(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;MockHttpServletRequestBuildercharacterEncoding(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信息,比如重定向后的属性信息;MockHttpServletRequestBuildersession(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:

继承自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);

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

在这里插入图片描述

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。在这里插入图片描述
在这里插入图片描述

 行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群:1150305204,里面有各种测试开发资料和技术可以一起交流哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub项目推荐-incubator

项目地址 Github地址&#xff1a;GitHub - apache/incubator-anser 官网&#xff1a;Apache Answer | Free Open-source Q&A Platform 项目简述 这是Apache的一个开源在线论坛&#xff0c;也可以部署成为一个自有的QA知识库。项目主要使用了Go和Typescript来开发&#…

【MATLAB源码-第109期】基于matlab的哈里斯鹰优化算发(HHO)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 哈里斯鹰优化算法&#xff08;Harris Hawk Optimization, HHO&#xff09;是一种受自然界捕食行为启发的优化算法。它基于哈里斯鹰的捕猎策略和行为模式&#xff0c;主要用于解决各种复杂的优化问题。这个算法的核心特征在于…

层叠布局(Stack)

目录 1、概述 2、开发布局 3、对齐方式 3.1、TopStart 3.2、Top 3.3、TopEnd 3.4、Start 3.5、Center 3.6、End 3.7、BottomStart 3.8、Bottom 3.9、BottomEnd 4、Z序控制 5、场景示例 1、概述 层叠布局&#xff08;StackLayout&#xff09;用于在屏幕上预留一…

31 树的存储结构二

DIsplay() 递归显示 :图示 求树的高度时&#xff0c;递归的技巧 在递归的过程中&#xff1a;ret单独和任意一个子树的子高度比较&#xff0c;如果ret<max&#xff0c;retmax ------------- 注意&#xff1a;组织链表和子链表的【元素类型】都是TLNode* 链表都要先通过TLNod…

JavaScript 动态生成内容的过程

网页使用 JavaScript 动态生成内容的过程涉及到 JavaScript 脚本与网页的 HTML 和 CSS 的交互。基本过程如下&#xff1a; 浏览器加载 HTML&#xff1a;首先&#xff0c;浏览器加载网页的 HTML 内容&#xff0c;这构成了页面的基本结构。 执行 JavaScript&#xff1a;随后&…

Validation--自定义校验

前言&#xff1a; 今天学到这个&#xff0c;闲着也是闲着&#xff0c;就写一个记录一下&#xff0c;也算是总结 我们的步骤是这样的 1.自定义注解State 2.自定义校验数据的类StateValidation实现ConstrainValidator接口 3.在需要校验的地方使用自定义注解 1.自定义注解 这…

C语言如何提高程序的可读性?

一、问题 可读性是评价程序质量的一个重要标准&#xff0c;直接影响到程序的修改和后期维护&#xff0c;那么如何提高程序的可读性呢? 二、解答 提高程序可读性可以从以下几方面来进行。 &#xff08;1&#xff09;C程序整体由函数构成的。 程序中&#xff0c;main()就是其中…

【C++学习笔记】C++多值返回写法

C不像python可以轻易地处理多值返回问题&#xff0c;处理使用指针或者引用将需要返回的值通过参数带出来&#xff0c;还有几种特殊的方式。 引用自&#xff1a;https://mp.weixin.qq.com/s/VEvUxpcJPsxT9kL7-zLTxg 1. Tuple tie 通过使用std::tie&#xff0c;我们可以将tuple…

Mysql事务隔离级别是怎么实现的?

Mysql事务 事务概念事务特性事务并发事务隔离级别MVCC多版本并发控制 事务概念 小钢同学今天发工资了&#xff0c;赶紧打开招商银行app看看工资到账了没有&#xff0c;查看余额300 嗯&#xff0c;今天心情好&#xff0c;给对象转账50大元买lv包包去&#xff0c;最后的结果肯定…

Vmware虚拟机问题解决方案 运行虚拟机系统蓝屏 运行虚拟机时报错VT-x

1. 运行虚拟机系统蓝屏 可能的原因有两个: 1). 虚拟机所在磁盘的空间不足 ; -------> 清理磁盘空间 。 2). 操作系统版本高, 需要适配新版本的Vmware ; ------> 卸载Vmware15版本, 安装Vmware16版本 。 2. 卸载Vmware步骤 1). 卸载已经安装的VMware 弹出确认框, 点击…

四旋翼无人机入门基础知识

电池 聚合物锂电池单体电芯的额定电压都为3.7V 电池的保存电压&#xff1a;单个电芯3.8V 电池的满电电压&#xff1a;单个电芯4.2V 串联&#xff1a;容量不变&#xff0c;电压相加&#xff0c;并联&#xff1a;电压不变&#xff0c;容量相加 S&#xff1a;串联&#xff0c;P&…

基于博弈树的开源五子棋AI教程[7 多线程搜索]

文章目录 引子定义实现结果尾记 引子 多线程加快搜索速度这一认知是经受住实践考验的。博弈树搜索的并行搜索方式有很多种&#xff0c;例如叶子并行&#xff0c;根并行&#xff0c;树分裂等算法。笔者给出一种实现起来比较简单的根并行算法。 在是实现时需要注意两点&#xff…

【LabVIEW FPGA入门】LabVIEW FPGA 实现SPI通信协议

该实现由两个组件组成&#xff1a;在 LabVIEW FPGA 中实现的 SPI 协议以及用于从主机 PC 或实时控制器与 FPGA 进行通信的 LabVIEW 主机接口。该架构允许从单个主机程序控制多个 SPI 端口&#xff0c;同时仍然允许定制 FPGA VI 以进行其他数据采集和处理。该实现不使用任何DMA&…

【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】

前言 大家好吖&#xff0c;欢迎来到 YY 滴C考前速过系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《…

2_单列模式_懒汉式单例模式

二.懒汉式单例模式 (1) 饿汉式单例模式概念 为了解决饿汉式单例可能带来的内存浪费问题&#xff0c;于是就出现了懒汉式单例的写法。懒汉式单例模式的特点是&#xff0c;单例对象要在被使用时才会初始化。 (2) 代码实现 实现代码方式1&#xff1a;简单的饿汉式单例 /*** 优…

解密威胁:.kat6.l6st6r 勒索病毒的威胁与恢复

导言&#xff1a; 在当今数字化时代&#xff0c;勒索病毒已经成为网络安全威胁中的一大巨头。其中&#xff0c;.kat6.l6st6r 勒索病毒以其狡猾的传播方式和高级的加密算法备受关注。本文将深入介绍.kat6.l6st6r 勒索病毒的特点、应对措施以及如何预防此类威胁。如果您在面对被…

基于java的 aws s3文件上传

aws s3 文件上传代码 首先&#xff0c;确保您已经在AWS上创建了一个S3存储桶&#xff0c;并拥有相应的访问密钥和密钥ID。这些凭据将用于在Java代码中进行身份验证。 接下来&#xff0c;需要在Java项目中添加AWS SDK的依赖。可以使用Maven或Gradle进行依赖管理。以下是一个Ma…

Kubernetes实战(十七)-设置kubernetes允许master调度pod

1 taint节点调度策略 NoSchedule: 一定不能被调度PreferNoSchedule: 尽量不要调度NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod 2 查看节点调度 $ kubectl describe node|grep -E "Name:|Taints:" Name: ops-master-1 Taints: no…

Kotlin 委托

Kotlin 委托 委托模式 是一种 通过 对象组合 实现代码重用 的设计模式&#xff0c; 对象处理请求时 将其 委托给 其他对象&#xff08;委托&#xff09;处理。 Kotlin 委托 分为&#xff1a; 类的委托属性的委托 一、类的委托 委托 Delegate 是实现继承的一种替代方式。达到了…

流量预测中文文献阅读(郭郭专用)

目录 基于流量预测的超密集网络资源分配策略研究_2023_高雪亮_内蒙古大学&#xff08;1&#xff09;内容总结&#xff08;2&#xff09;流量预测部分1、数据集2、结果对其中的一个网格的CDR进行预测RMSE和R2近邻数据和周期数据对RMSE的影响 &#xff08;3&#xff09;基于流量预…