SpringBoot MockMvc

SpringBoot MockMvc

  • 1 什么是 MockMvc?
  • 2 为什么使用 MockMvc?
  • 3 如何使用 MockMvc?
    • 3.1 Controller
    • 3.2 测试方法一
    • 3.3 测试方法二

1 什么是 MockMvc?

Spring Boot 提供了一个方便的测试工具类 MockMvc,用于对 Controller 层进行单元测试。MockMvc 提供了模拟 HTTP 请求的能力,让你可以在不启动完整的 HTTP 服务器的情况下测试 Spring MVC 控制器。

2 为什么使用 MockMvc?

快速:MockMvc 可以在不启动完整的应用程序服务器的情况下进行单元测试,因此测试速度更快。
集成度高:它能够模拟 HTTP 请求和响应,以及 Spring MVC 的所有特性,如路由、过滤器、拦截器等。
灵活性:可以对控制器的行为进行精确的模拟和验证,包括请求参数、路径变量、请求头等。

3 如何使用 MockMvc?

在使用 MockMvc 进行单元测试时,你需要创建一个 MockMvc 实例,并使用它来构建和执行 HTTP 请求,然后验证返回结果。

3.1 Controller

package com.xu.test.controller;import com.xu.test.service.TestService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/test")
public class TestController {@Resourceprivate TestService testService;@RequestMapping("/test1")public String test1(String a, Integer b) {return testService.test1(a, b);}@RequestMapping("/test2")public Object test2(HttpServletRequest request, HttpServletResponse response, String a, Integer b) {testService.test2(request, response, a, b);Map<String, Object> body = new HashMap<>();body.put("a", a);body.put("b", b);return body;}}

3.2 测试方法一

package com.xu.test;import cn.hutool.json.JSONUtil;
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.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;import javax.servlet.http.Cookie;
import java.util.HashMap;
import java.util.Map;@SpringBootTest
@RunWith(SpringRunner.class)
public class MockMvcTest1 {private MockMvc mock;@Autowiredprivate WebApplicationContext wac;@Beforepublic void setUp() {mock = MockMvcBuilders.webAppContextSetup(wac).build();}@Testpublic void get() throws Exception {ResultActions actions = mock.perform(MockMvcRequestBuilders.get("/test/test1?a=1&b=2").header("X-Access-Token", "0123456789").cookie(new Cookie("cookie", "123456789")).param("a", "1").param("b", "2"));// 期望请求成功actions.andExpect(MockMvcResultMatchers.status().isOk());// 打印请求头actions.andDo(MockMvcResultHandlers.print());MvcResult result = actions.andReturn();// 断言Assert.assertTrue(result.getResponse().isCommitted());}@Testpublic void post() throws Exception {// 请求体Map<String, Object> body = new HashMap<>();body.put("a", "1");// 请求ResultActions actions = mock.perform(MockMvcRequestBuilders.post("/test/test2").header("X-Access-Token", "0123456789").header(HttpHeaders.AUTHORIZATION, "0123456789").content(JSONUtil.toJsonPrettyStr(body)).param("a", "1").param("b", "2").contentType(MediaType.APPLICATION_JSON_VALUE));// 期望返回的是JSONactions.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON));// 期望返回的a=1actions.andExpect(MockMvcResultMatchers.jsonPath("$.a").value(1));// 期望请求成功actions.andExpect(MockMvcResultMatchers.status().isOk());// 打印请求头actions.andDo(MockMvcResultHandlers.print());// 结果MvcResult result = actions.andReturn();// 断言Assert.assertEquals(MediaType.APPLICATION_JSON_VALUE, result.getResponse().getContentType());}}

3.3 测试方法二

package com.xu.test;import com.xu.test.controller.TestController;
import com.xu.test.service.TestService;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;import javax.servlet.http.Cookie;@RunWith(SpringRunner.class) // 声明使用 SpringRunner 进行测试
@WebMvcTest(TestController.class) // 声明需要测试的 Controller 类
public class MockMvcTest3 {@Autowiredprivate MockMvc mockMvc;@MockBeanprivate TestService testService;@Testpublic void test1() throws Exception {ResultActions actions = mockMvc.perform(MockMvcRequestBuilders.get("/test/test1").header("X-Access-Token", "0123456789").cookie(new Cookie("cookie", "123456789")).param("a", "1").param("b", "2"));// 期望请求成功actions.andExpect(MockMvcResultMatchers.status().isOk());// 打印请求头actions.andDo(MockMvcResultHandlers.print());// 结果MvcResult result = actions.andReturn();// 断言Assert.assertTrue(result.getResponse().isCommitted());}}

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

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

相关文章

【JavaScript超详细的学习笔记-下】JavaScrip超详细的学习笔记,共27部分,12多万字,学习js不错的选择,内容超详细

想要获取笔记的可以点击下面链接获取&#xff0c;或者私信我 ** JavaScript超详细的学习笔记&#xff0c;点击我获取 13&#xff0c;闭包 13-1 闭包 闭包是指有权访问另一个函数作用域中的变量的函数&#xff1b;其本质就是在一个函数内部创建另一个内部函数&#xff1b;并…

基于若依的开源网盘系统

简介 在线网盘系统&#xff0c;使用了DFA算法&#xff0c;实现了文件夹的创建与修改&#xff0c;多级目录&#xff0c;很正常的文件夹一样&#xff0c;支持所有文件上传&#xff0c;并按文件类型分类&#xff0c;支持文件删除&#xff0c;回收站管理&#xff0c;恢复与彻底删除…

数据特征降维 | 局部线性嵌入(LLE)

局部线性嵌入(Locally Linear Embedding,LLE)是一种非线性降维和数据嵌入技术,用于将高维数据映射到低维空间中,以便更好地展示数据的结构和关系。 LLE的基本思想是假设数据样本在局部区域内可以近似由其相邻样本的线性组合表示。通过保持这种局部线性关系,LLE能够在低维…

掌握QPainter:Qt中的绘图艺术

目录标题 1. QPainter概述2. 创建QPainter对象3. 绘制基本图形4. 绘制文本5. 绘制图像6. 使用画笔&#xff08;QPen&#xff09;7. 使用画刷&#xff08;QBrush&#xff09;8. 图形变换9. 抗锯齿与优化10. 实例代码与解析11. 总结 在Qt的世界里&#xff0c;QPainter是一位多才多…

设计模式-11 - Adapter Pattern 适配器设计模式

设计模式-11 - Adapter Pattern 适配器设计模式 1.定义 适配器模式是一种结构型设计模式&#xff0c;它允许具有不同接口的两个类一起工作。它通过创建一个适配器类来实现这一点&#xff0c;该适配器类将一个类的接口转换为另一个类所需的接口。 2.内涵 适配器设计模式的内涵…

低空经济:无人机竞赛详解

无人机竞赛市场近年来呈现出蓬勃发展的态势&#xff0c;其市场价值不仅体现在竞赛本身&#xff0c;还体现在推动无人机技术创新、拓展应用场景以及促进产业链发展等多个方面。 一、比赛项目介绍 无人机竞赛通常分为多个项目&#xff0c;包括竞速赛、技巧赛、航拍赛等。每个项目…

Ubuntu下C++编程总结AllInOne

之前主要是在win下用VisualStudio&#xff0c;现在研究总结在ubuntu下使用CMake编程经验&#xff0c;填坑记录 目录 0. 前述1.Ubuntu下多线程使用 0. 前述 1.Ubuntu下多线程使用 出现的问题&#xff1a;undefined reference to symbol pthread_create 使用多线程&#xff0c…

HR人才测评:自控能力与岗位胜任力素质测评

自控能力是什么&#xff1f; 自控能力可以解释为自我控制的能力&#xff0c;指一个人在应对人事物突发事件时&#xff0c;及时调整进行的自我控制的表现&#xff0c;它是实行自我支配的一种能力&#xff0c;在能进行自主支配时&#xff0c;一个人就成熟不少了&#xff0c;也可以…

js的跳转传参方式

在JavaScript中&#xff0c;实现页面跳转并传递参数的方式有多种&#xff0c;以下是一些常见的方法&#xff1a; URL参数 你可以通过修改URL的查询字符串&#xff08;query string&#xff09;来传递参数。这些参数会在URL的?之后&#xff0c;并使用&进行分隔。 代码 /…

优选算法——双指针1

双指针 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是左右指针。 对撞指针&#xff1a;⼀般⽤于顺序结构中&#xff0c;也称左右指针。 对撞指针从两端向中间移动。⼀个指针从最左端开始&#xff0c;另⼀个从最右端开始&#xff0c;然后逐渐往中间逼 近…

std::mem_fn和std::mem_fun

std::mem_fn和std::mem_fun&#xff08;deprecated&#xff09; Convert member function to function object&#xff0c;即将成员函数转化为函数对象&#xff0c;这样就可以像普通函数那样使用。 示例一&#xff1a; #include <iostream> // std::cout #include …

MySQL-InnoDB数据存储结构

1、存储结构-页 索引结构提供了高效的索引方式&#xff0c;索引信息以及数据记录都保存在数据文件或索引文件中&#xff08;本质存储在页结构中&#xff09; 1.1、磁盘与内存交互的基本单位&#xff1a;页 在InnoDB中将数据划分为若干页&#xff0c;页的默认大小为&#xff…

webpack并行构建示例:

由于js的单线程特性&#xff0c;文件和任务时 要等待一个任务执行完成后执行下一个任务&#xff0c;但在实际开发中&#xff0c;很多任务是可以并行执行的&#xff08;如同时处理多个不同js文件或同事压缩多张图片&#xff09;&#xff0c;一些loader和插件&#xff08;thread-…

【数据结构】解密链表之旅(单链表篇)

前言 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我想让大家知道…

自制无感无刷电机驱动板

自制无感无刷电机驱动板 分别测试了基于C251的STC32G单片机、Arduino AVR的ATmega328PB、以及ARM的ST32F103单片机。 &#x1f9f2;测试转动效果 ✒目前市面上开源的有关无刷电机的项目数不胜数&#xff0c;其控制原理都大同小异&#xff0c;在没有领透其技术要领情况下&#x…

苍穹外卖项目---------收获以及改进(9-12)

①Spring Task-------实现系统定时任务 概念&#xff1a; 应用场景&#xff1a; 使用步骤&#xff1a; 实现订单超时和前一天派送中的订单的自动任务处理&#xff1a; Component Slf4j public class Mytask {Autowiredprivate OrderServiceimpl orderServiceimpl;/*** 处理订…

yarn 安装以及报错处理

前一种报错是由于没有安装yarn导致的&#xff0c;使用以下命令即可安装&#xff1a; npm install -g yarn 如果成功安装&#xff0c;将显示Yarn的版本号。 yarn --version 第二种报错是因为系统上的执行策略限制导致的。执行策略是一种安全功能&#xff0c;用于控制在计算机…

grafana10.x报错 Failed to upgrade legacy queries Datasource x was not found

问题 grafana 从6.x升级到10.x后&#xff0c;导入json文件后报错&#xff0c;数据源x查询不到&#xff0c;grafana不显示数据&#xff1b; Templating Failed to upgrade legacy queries Datasource x was not found解决方法 可能grafana升级后数据源找不到&#xff0c;在面板…

上海市计算机学会竞赛平台2023年10月月赛丙组三个数的中位数

题目描述 给定三个整数&#xff0c;请输出按大小排序后&#xff0c;位于正中间的数字。 输入格式 第一行&#xff1a;三个整数 &#x1d44e;a, &#x1d44f;b 与 &#x1d450;c 输出格式 第一行&#xff1a;单个整数表示三者的中位数 数据范围 −10000≤&#x1d44e…

CentOS7 源码编译 rtpengine9.5.8

CentOS7 不好搞&#xff0c;但应客户要求&#xff0c;不得不搞 选择 rtpengine9.5.8 版本而不是更新的版本&#xff0c;肯定是有自己的考虑的 不废话了&#xff0c;直接上脚本&#xff1a; #!/bin/bash# CentOS7 最小安装yum -y install epel-release yum -y install git gc…