项目测试之MockMvc

文章目录

  • 基础
    • 基础概念
    • Mockxxx
    • 一般实现
    • 文件位置
  • 实战
    • MockMvc与Test注解不兼容
    • @RequestParams参数
    • @RequestBody参数

基础

基础概念

定义:是Spring框架提供的一种用于测试Spring MVC控制器的工具,它允许开发者在不启动完整的web服务器的情况下,模拟HTTP请求并验证响应。优点:执行速度快 --》 不需要启动web服务器;便于集成 --》 可以与JunitTestNG等测试框架无缝衔接;强大的功能 --》  对HTTP请求的详细配置和响应的全面验证;依赖配置:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

Mockxxx

MockMvc:来自于:import org.springframework.test.web.servlet.MockMvc;定义:是Spring Test模块的一部分,它允许开发者对Spring MVC控制器进行单元测试而无需启动完整的Web服务器;通过MockMvc,可以模拟HTTP请求并验证响应,使得测试执行速度更快,同时便于与JUnitTestNG等测试框架集成。使用:使用mockMvc。perform()模拟HTTP请求,使用.andExpect().andReturn()等方法进行响应验证。
Mockito:来自于:import org.mockito.Mockito;定义:流行的Java单元测试框架,专门用于创建和验证模拟对象的行为。它允许开发者在编写测试时模拟外部依赖,从而使得测试更便捷,减少对外部类、系统和依赖给单元测试带来的耦合。特点:行为验证、测试桩、参数匹配器、注册支持、监控真实对象、重置mock对象;
MvcResult:来自于:import org.springframework.test.web.servlet.MvcResult;定义:是在执行模拟HTTP请求以测试控制器(Controller)层功能时的重要概念,它代表一个完整的HTTP响应结果,包括响应的状态码、头信息、响应体以及任何可能产生的错误等。作用:封装HTTP响应 -》封装由模拟的HTTP产生的完整响应信息;获取响应细节 -》包括响应的状态码、头信息、响应体等内容;断言测试 -》 使用MvcResult中的方法进行断言,确保控制器返回正确的HTTP状态码和数据;

一般实现

// 类注解,用于配置 JUnit 5 测试类以使用 Spring 的测试支持。
@ExtendWith(SpringExtension.class)// 是一个 Spring Boot 提供的注解,用于对 Web 层(即控制器层)进行测试。如果使用该注解,那么Spring Boot 会自动配置一个模拟的 Spring MVC 环境,这样就可以在不启动完整应用的情况下测试控制器的行为。
@WebMvcTest(value = {Controller.class, Handler.class})// 完成bean自动装配
@Autowired
private MockMvc mockMvc;// 标识测试方法
@Test
MockHttpServletRequestBuilder requestBuilder = get("控制类路径/xxx/xxx");
// MockHttpServletRequestBuilder 是一个用于构建模拟HTTP请求的工具类。
// 主要在单元测试和集成测试中使用,构造出特定的HTTP请求来测试控制器(Controller)或端点(Endpoint)。
requestBuilder.param("参数名", 参数值);
// 给已创建的mockhttpservletrequestbuilder实例添加查询参数; 
// 将参数通过键值对的形式填入MockHttpServletRequestBuilder对象中;mockMvc.perform(requestBuilder) // mockMvc对象执行,之前定义的requestbuiler对象.andExpect(status().isOk()) // 该调用方式是链式调用;--》 用于检查HTTP响应的状态码是否是200.andDo(new ResultHandler() { // 自定义处理MvcResult对象,即模拟请求后的结果@Overridepublic void handle(MvcResult mvcResult) throws Exception {// 获取响应体并将其转化为字符串类型;String content = mvcResult.getResponse().getContentAsString();// 检查响应体是否为空,以确保有数据返回;assertTrue(StringUtils.isNotBlank(content));// 将响应体内容解析成map集合Map<String, String> resp = JSONUtils.toMap(content);// 验证code/message 两个属性的值是否等于1/success;assertEquals("1", resp.get("code"));assertEquals("success", resp.get("message"));// 获取data属性对应的值String data = resp.get("data");// base64解码byte[] encryptedData = Base64.decode(data);// aes密钥生成AES aes = genAES(keyIv);// 解密data对应的值String json = new String(aes.decrypt(encryptedData), StandardCharsets.UTF_8);// json format is ResponseKeyCollection 自定义的一个类ResponseKeyCollection collection = JSONUtils.toObject(json, ResponseKeyCollection.class);// 将json转成 ResponseKeyCollection对象assertEquals(10, collection.getResponseKeys().size());// 验证对象中getResponseKeys方法返回的集合大小是否为10}});@BeforeEach
ResponseKey responseKey1 = COLLECTION.getResponseKeys().stream().filter(key -> key.getIndex() == 1).findFirst().orElse(null);
// COLLECTION获取ResponseKeys属性--》转换为流--》过滤出index=1的responseKey对象
// --》查找第一个满足条件的--》有则返回,无则返回null;
// COLLECTION 是自定义的对象
Mockito.when(keyStoreService.getResponseKey(1)).thenReturn(responseKey1);
// 模拟该方法,当此入参为1时,则返回上述找到的对象;
Mockito.when(keyStoreService.generateResponseKeyCollection(10)).thenReturn(COLLECTION);
// 模拟该方法,当此入参为10时,则返回Collecion对象;
Mockito.when(keyHelper.isExpiredKeyIndex(anyInt())).thenReturn(false);
// 模拟此方法,不管该方法入参为谁,都返回false --》 即keyIndex永不过期

文件位置

与项目目录保持一致;
假设项目文件为src/main/java/xxx/controller/xxxController
测试类项目文件为src/test/java/xxx/controller/xxxTest

实战

MockMvc与Test注解不兼容

参考博客:https://segmentfault.com/q/1010000042943340

描述:使用    @Autowiredprivate MockMvc mockMvc;总是导致注入的mockMvc失败;
原因是:MockMvc@Test不兼容的问题;原本依赖库为:org.junit.Test 改成org.junit.jupiter.api.Test 就可以了;两个依赖库之间的关系为:org.junit.Test --JUnit4 org.junit.jupiter.api.Test --JUnit5

@RequestParams参数

MockHttpServletRequestBuilder requestBuilder = get("/decrypt");
requestBuilder.param("id1", id1);
requestBuilder.param("id2", id2);
mockMvc.perform(requestBuilder).andExpect(status().isOk()).andDo(mvcResult -> {String content = mvcResult.getResponse().getContentAsString();
});

@RequestBody参数

接口请求参数:
@RequestMapping("/getfunction1")
public ResultDtoRisk riskGetTokenByph(HttpServletRequest request, @RequestBody NumReq numReq){}测试代码:
@Autowired
pivate MockMvc mockMvc;
// import org.springframework.test.web.servlet.MockMvc;NumReq numReq = new NumReq();
numReq.setId1(id1);
numReq.setId2(id2);MockHttpServletRequestBuilder requestBuilder = get("/getfunction1");
// import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
String requestBodyContent = objectMapper.writeValueAsString(numReq);requestBuilder.contentType(MediaType.APPLICATION_JSON_VALUE).content(requestBodyContent);mockMvc.perform(requestBuilder).andExpect(status().isOk()).andDo(print());

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

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

相关文章

服务器虚拟化实战:架构、技术与最佳实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 服务器虚拟化是现代 IT 基础设施的重要组成部分&#xff0c;通过虚拟化技术可以提高服务器资源利用率、降低硬件成本&am…

【LLM】Ollama框架入门指北

note Ollama是一个开源框架&#xff0c;专门设计用于在本地运行大型语言模型。它的主要特点是将模型权重、配置和数据捆绑到一个包中&#xff0c;从而优化了设置和配置细节&#xff0c;包括GPU使用情况&#xff0c;简化了在本地运行大型模型的过程。Ollama提供了对模型量化的支…

Linux系统:Ubuntu替换镜像源具体方法;

在Linux系统更新下载软件时&#xff0c;如遇因镜像源问题下载失败时&#xff0c;我们就需要替换系统原有镜像源&#xff0c;那么&#xff0c;此时&#xff0c;你是否还在百度四处搜索可以用的镜像源地址&#xff0c;然后反复去测试源地址的正确性呢&#xff0c;下面介绍一个亲测…

使用vhd虚拟磁盘安装两个win10系统

使用vhd虚拟磁盘安装两个win10系统 前言vhd虚拟磁盘技术简介准备工具开始动手实践1.winX选择磁盘管理2.选择“操作”--“创建VHD”3.自定义一个位置&#xff0c;输入虚拟磁盘大小4.右键初始化磁盘5.选择GPT分区表格式6.右键新建简单卷7.给卷起个名字&#xff0c;用于区分8.打开…

HTML(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、前言二、HTML基础2.1 什么是HTML?2.2 认识HTML标签2.2.1 HTML标签当中的基本结构2.2.2 标签层次结构 2.3 HTML常见标签2.3.1 标题标签2.3.2 段落标签2.3.3…

d3.js: Relation Graph

d3.js Tags d3/d3 GitHub D3 by Observable | The JavaScript library for bespoke data visualization 下载或 <!-- 引入 D3.js 库 --> <script src"https://d3js.org/d3.v7.min.js"></script> <!-- 引入 D3.js 库 --> <…

Oracle Primavera P6自动进行进度计算

前言 在P6 Professional 有一个自动计划计算的选项&#xff0c;很多人不了解该设置如何使用&#xff0c;以及什么时候该启动这项配置。 详情 P6 Professional 默认为非自动进度计算。启用自动选项后&#xff0c;可以快速查看调度更改的效果。 ​ ​ 如图所示&#xff0c;当你…

反射、枚举以及lambda表达式

一.反射 1.概念&#xff1a;Java的反射&#xff08;reflection&#xff09;机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;既然能拿到那么&am…

【Proteus仿真】【51单片机】简易计算器系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键​ 3、可以进行简单的加减乘除运算 4、最大 9999*9999 二、使用步骤 系统运行后&#xff0c;LCD1602显示数据&#xff0c;通过矩阵按键…

HarmonyOS简介:HarmonyOS核心技术理念

核心理念 一次开发、多端部署可分可合、自由流转统一生态、原生智能 一次开发、多端部署 可分可合 自由流转 自由流转可分为跨端迁移和多端协同两种情况 统一生态 支持业界主流跨平台开发框架&#xff0c;通过多层次的开放能力提供统一接入标准&#xff0c;实现三方框架快速…

(即插即用模块-特征处理部分) 十九、(NeurIPS 2023) Prompt Block 提示生成 / 交互模块

文章目录 1、Prompt Block2、代码实现 paper&#xff1a;PromptIR: Prompting for All-in-One Blind Image Restoration Code&#xff1a;https://github.com/va1shn9v/PromptIR 1、Prompt Block 在解决现有图像恢复模型时&#xff0c;现有研究存在一些局限性&#xff1a; 现有…

Day24-【13003】短文,数据结构与算法开篇,什么是数据元素?数据结构有哪些类型?什么是抽象类型?

文章目录 13003数据结构与算法全书框架考试题型的分值分布如何&#xff1f; 本次内容概述绪论第一节概览什么是数据、数据元素&#xff0c;数据项&#xff0c;数据项的值&#xff1f;什么是数据结构&#xff1f;分哪两种集合形式&#xff08;逻辑和存储&#xff09;&#xff1f…

使用 MSYS2 qemu 尝鲜Arm64架构国产Linux系统

近期&#xff0c;我的师弟咨询我关于Arm64架构的国产CPU国产OS开发工具链问题。他们公司因为接手了一个国企的单子&#xff0c;需要在这类环境下开发程序。说实在的我也没有用过这个平台&#xff0c;但是基于常识&#xff0c;推测只要基于C和Qt&#xff0c;应该问题不大。 1. …

unity学习21:Application类与文件存储的位置

目录 1 unity是一个跨平台的引擎 1.1 使用 Application类&#xff0c;去读写文件 1.2 路径特点 1.2.1 相对位置/相对路径&#xff1a; 1.2.2 固定位置/绝对路径&#xff1a; 1.3 测试方法&#xff0c;仍然挂一个C#脚本在gb上 2 游戏数据文件夹路径&#xff08;只读&…

【Redis】hash 类型的介绍和常用命令

1. 介绍 Redis 中存储的 key-value 本身就是哈希表的结构&#xff0c;存储的 value 也可以是一个哈希表的结构 这里每一个 key 对应的一个 哈希类型用 field-value 来表示 2. 常用命令 命令 介绍 时间复杂度 hset key field value 用于设置哈希表 key 中字段 field 的值为…

基于51单片机和WS2812B彩色灯带的流水灯

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码四、主函数总结 系列文章目录 前言 用彩色灯带按自己想法DIY一条流水灯&#xff0c;谁不喜欢呢&#xff1f; 所用单片机&#xff1a;STC15W204S &#xff08;也可以用其他1T单片机&#xff0c;例如&#xff0c;S…

力扣017_最小覆盖字串题解----C++

题目描述 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针&#xff0c;一个用于「延伸」现有窗口的 r 指针&#xff0c;和一个用于「收缩」窗口的 l 指针。在任意时刻&#xff0c;只有一个指针运动&#xff0c;而另一个保持静止。我们在 s 上滑动…

如何从客观角度批判性阅读分析博客

此文仅以个人博客为例&#xff0c;大量阅读朋友反馈给我的交流让我得知他们所理解我的博客所表达的意思并非我所想表达的&#xff0c;差异或大或小&#xff0c;因人而异。 观点与事实 只有从客观角度反复批判性阅读和分析&#xff0c;才能逐渐清晰观点和事实。 观点不等于事实…

深入理解MySQL 的 索引

索引是一种用来快速检索数据的一种结构, 索引使用的好不好关系到对应的数据库性能方面, 这篇文章我们就来详细的介绍一下数据库的索引。 1. 页面的大小: B 树索引是一种 Key-Value 结构&#xff0c;通过 Key 可以快速查找到对应的 Value。B 树索引由根页面&#xff08;Root&am…

Spring Boot项目如何使用MyBatis实现分页查询及其相关原理

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…