SpringBoot+Mock Mvc测试web接口增删改查、导入导出

需求:

        使用Mock Mvc单元测试web接口的增删改查、导入、导出功能,涵盖登录 token header赋值等全流程

1,引入核心依赖

<!-- 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency>

2,编写登录抽象父类

@Component
public class AbstractControllerTest {private static final String USER_NO = "xxxx";private static final String PASSWORD = "xxxx";private static final String LOGIN_URL_DEV = ConstantsProperties.UAC_HOST+"/xxxx/auth/login";public static final String FILE_ROOT = System.getProperty("user.dir")+"/src/test/java/com/xxx/xxxx/controller/file";@Autowiredprivate WebApplicationContext webApplicationContext;@Autowiredprivate ApiGlobalVarsFilter apiGlobalVarsFilter;public MockMvc mockMvc;@AutowiredRestTemplate restTemplate;public String token;@Beforepublic void setupMockMvc(){//获取登录tokenLoginRequest request = new LoginRequest();request.setUserNo(USER_NO);request.setPassword(PASSWORD);ResponseEntity<LoginResponse> loginResponseResponseEntity =restTemplate.postForEntity(LOGIN_URL_DEV, request, LoginResponse.class);token = loginResponseResponseEntity.getBody().getToken();mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(SecurityMockMvcConfigurers.springSecurity()).addFilters(apiGlobalVarsFilter).build();}}

3,编写单元测试核心类

@ActiveProfiles("dev")
@RunWith(SpringRunner.class)
@SpringBootTest(classes = YmsApplication.class)
@Slf4j
public class TCommTagConfigControllerTest extends AbstractControllerTest{@AutowiredTCommTagConfigService tCommTagConfigService;@Testpublic void login(){log.info("登录token为:{}",token);}@Testpublic void save() throws Exception {TCommTagConfigReqBody tCommTagConfigReqBody = new TCommTagConfigReqBody();tCommTagConfigReqBody.setTag("测试1");tCommTagConfigReqBody.setOwner("test");String requestBody = JSONUtil.toJsonStr(tCommTagConfigReqBody);mockMvc.perform(MockMvcRequestBuilders.post("/v1/tagConfig/save").contentType(MediaType.APPLICATION_JSON).content(requestBody).header("Authorization",token)).andDo(MockMvcResultHandlers.print());}@Testpublic void update() throws Exception {TCommTagConfigReqBody tCommTagConfigReqBody = new TCommTagConfigReqBody();tCommTagConfigReqBody.setId(62L);tCommTagConfigReqBody.setTag("测试11");tCommTagConfigReqBody.setOwner("test2");String requestBody = JSONUtil.toJsonStr(tCommTagConfigReqBody);mockMvc.perform(MockMvcRequestBuilders.post("/v1/tagConfig/save").contentType(MediaType.APPLICATION_JSON).content(requestBody).header("Authorization",token)).andDo(MockMvcResultHandlers.print());}@Testpublic void delete() throws Exception {String ids = "63,64";mockMvc.perform(MockMvcRequestBuilders.get("/v1/tagConfig/delete?ids="+ids).contentType(MediaType.APPLICATION_JSON).header("Authorization",token)).andDo(MockMvcResultHandlers.print());}@Testpublic void getList() throws Exception {TCommTagConfigPageReqBody tCommTagConfigPageReqBody = new TCommTagConfigPageReqBody();tCommTagConfigPageReqBody.setOwner("test");tCommTagConfigPageReqBody.setTag("测试");mockMvc.perform(MockMvcRequestBuilders.post("/v1/tagConfig/getList").contentType(MediaType.APPLICATION_JSON).content(JSONUtil.toJsonStr(tCommTagConfigPageReqBody)).header("Authorization",token)).andDo(MockMvcResultHandlers.print());}@Testpublic void exportFile() throws Exception {TCommTagConfigPageReqBody tCommTagConfigPageReqBody = new TCommTagConfigPageReqBody();tCommTagConfigPageReqBody.setIsExcel("1").setIsEmpty("0").setIsConfig("1");tCommTagConfigPageReqBody.setOwner("test");tCommTagConfigPageReqBody.setTag("测试");mockMvc.perform(MockMvcRequestBuilders.post("/v1/tagConfig/export").contentType(MediaType.APPLICATION_JSON).content(JSONUtil.toJsonStr(tCommTagConfigPageReqBody)).header("Authorization",token)).andDo(result -> {//保存为文件  文件目录需要自建File file  = new File(FILE_ROOT+"/tag/exportFile.xlsx");if(!file.exists()){file.createNewFile();}try(FileOutputStream fileOutputStream = new FileOutputStream(file)){IOUtils.write(result.getResponse().getContentAsByteArray(),fileOutputStream);}catch (IOException e){log.error("文件导出失败,异常信息:{}",e.getMessage());}//assertMatcherAssert.assertThat(file.exists(), Matchers.equalTo(true));MatcherAssert.assertThat(file.length(), Matchers.greaterThan(1024L));});}@Testpublic void importFile() throws Exception {//保存为文件  文件目录需要自建File file  = new File(FILE_ROOT+"/tag/Tag Config.xlsx");ResultActions resultActions = mockMvc.perform(MockMvcRequestBuilders.fileUpload("/v1/tagConfig/import").file(new MockMultipartFile("file", "Tag Config.xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",new FileInputStream(file))).header("Authorization",token));MvcResult mvcResult = resultActions.andDo(MockMvcResultHandlers.print()).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();String result = new String(mvcResult.getResponse().getContentAsByteArray(),"UTF-8");log.info("==========结果为:{}==========" ,result);}
}

参照:

MockMVC测试上传文件功能_mockmultipartfile怎么测试上传的excel文件-CSDN博客

SpringBoot基础之MockMvc单元测试 - 知乎 (zhihu.com)

MultipartFile的使用小结 - 邱明成 - 博客园 (cnblogs.com)

设置 MockMvc 和 Spring Security :: Spring Security Reference (springdoc.cn)

Spring Boot干货系列:(十二)Spring Boot使用单元测试 - 知乎 (zhihu.com)

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

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

相关文章

从零创建一个vue2项目

标题从零创建一个vue2项目&#xff0c;项目中使用TensorFlow.js识别手写文字 npm切换到淘宝镜像 npm config set registry https://registry.npm.taobao.org安装vue/cli -g npm install -g vue/cli检查是否安装成功 vue -V创建项目 vue create 项目名安装TensorFlow npm …

RAC中Voting盘相关总结

一、概述 在Oracle RAC&#xff08;Real Application Clusters&#xff09;环境中&#xff0c;"voting盘" 是用于存储集群的心跳信息和状态信息的特殊磁盘。每个节点都可以访问并共享此磁盘上的数据。voting盘在Oracle RAC中扮演着至关重要的角色&#xff0c;用于维护…

cpp笔记-24-05-10

1、public —— 外部也能访问 2、private —— 只能内部&#xff08;友元也可以&#xff09; 3、explicit —— 只可用于声明単参构造函数。声明类的构造函数是显示调用&#xff0c;不是隐式。阻止调用构造函数时隐式转换&#xff08;赋值初始化&#xff09; 4、默认构造函数…

Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之触控开关二

Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之触控开关二 1.概述 这篇文章在触摸屏上绘制一个开关&#xff0c;通过点击开关实现控制灯的开关功能。 2.硬件 硬件连接参考第一篇文章介绍 Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之获取触控坐标一 3.实现…

在线caj转换成pdf免费吗?caj变成pdf很容易!点进来!

在数字化阅读日益盛行的今天&#xff0c;各种电子文献格式层出不穷&#xff0c;其中CAJ和PDF无疑是两种最为常见的格式。CAJ是中国知网推出的一种专用全文阅读格式&#xff0c;而PDF则因其跨平台、不易被修改的特性&#xff0c;受到了广大读者的青睐。因此&#xff0c;将CAJ格式…

Auto.js如何打包成APK文件

Auto.js 是一个基于 JavaScript 的自动化脚本工具&#xff0c;它可以被打包成 APK 文件&#xff0c;以便在 Android 设备上安装和运行。以下是根据您提供的搜索结果中关于如何将 Auto.js 脚本打包成 APK 文件的步骤&#xff1a; 1. **安装 Auto.js App**&#xff1a;首先&…

【C++】 类的新成员:static成员和类的好朋友:友元

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a; 类的新成员&#xff1a;static成员和类的好朋友&#xff1a;友元 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Li…

网络编程套接字(一) 【简单的Udp网络程序】

网络编程套接字<一> 理解源端口号和目的端口号PORT VS PID认识TCP协议和UDP协议网络字节序socket编程接口sockaddr结构简单的UDP网络程序服务端创建套接字服务端绑定运行服务器客户端创建套接字关于客户端的绑定问题启动客户端启动客户端本地测试INADDR_ANY 理解源端口号…

怎么给视频加水印?2招轻松搞定

在数字媒体时代&#xff0c;视频水印作为一种有效的版权保护手段&#xff0c;被广泛应用于各种场景。给视频添加水印不仅可以防止内容被恶意盗用&#xff0c;还能增加视频的辨识度&#xff0c;提升品牌形象。本文将为您介绍2种简单易行的方法&#xff0c;教您怎么给视频加水印&…

Linux进程控制——Linux进程等待

前言&#xff1a;接着前面进程终止&#xff0c;话不多说我们进入Linux进程等待的学习&#xff0c;如果你还不了解进程终止建议先了解&#xff1a; Linux进程终止 本篇主要内容&#xff1a; 什么是进程等待 为什么要进行进程等待 如何进程等待 进程等待 1. 进程等待的概念2. 进…

软件杯 深度学习的水果识别 opencv python

文章目录 0 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习…

【数据结构】平衡二叉树(插入、查找、删除)解析+完整代码

3.2 平衡二叉树 3.2.1 定义 平衡二叉树&#xff0c;简称平衡树&#xff08;AVL树&#xff09; 树上任一结点的左右子树高度差不超过1。 结点的平衡因子左子树高-右子树高 3.2.2 插入操作 插入结点后&#xff0c;可能造成不平衡 要调整最小不平衡子树&#xff0c;使其恢复平衡。…

武装部三维电子沙盘-行动路径规划分析平台

武装部三维电子沙盘-行动路径规划分析平台是一款集成了大数据、云计算、虚拟现实、物联网、AI等先进技术的综合性系统。它真实模拟地形、地貌、地物&#xff0c;结合地理空间专业数据、执勤兵力部署、基干民兵信息、普通民兵信息、潜力资源信息、军队相关专业数据、兵要地志数据…

【回溯 代数系统】679. 24 点游戏

本文涉及知识点 回溯 代数系统 LeetCode679. 24 点游戏 给定一个长度为4的整数数组 cards 。你有 4 张卡片&#xff0c;每张卡片上都包含一个范围在 [1,9] 的数字。您应该使用运算符 [‘’, ‘-’, ‘*’, ‘/’] 和括号 ‘(’ 和 ‘)’ 将这些卡片上的数字排列成数学表达式…

SQLserver - 笔记

1 SQLserver - 用户管理 4、SQL SERVER数据库用户管理_哔哩哔哩_bilibili 创建用户 - user 2.选择用户&#xff0c;修改属性

Qt---绘图和绘图设备

一、QPainter绘图 绘图事件 void paintEvent() 声明一个画家对象&#xff0c;OPainter painter(this) this指定绘图设备 画线、画圆、画矩形、画文字 设置画笔QPen 设置画笔宽度、风格 设置画刷QBrush 设置画刷风格 代码示例&#xff1a; #includ…

LeetCode---循环队列

循环队列就是只有固定的内存&#xff0c;存数据&#xff0c;出数据&#xff0c;但是也和队列一样&#xff0c;先进先出。如下图所示&#xff0c;这是他的样子 在head出&#xff0c;tail进&#xff0c;但是这个如果用数组解决的话&#xff0c;就有问题&#xff0c;力扣给我们的接…

libx265的交叉编译

目标平台&#xff1a;aarch64 编译器版本&#xff1a;aarch64-linux-gnu- 操作系统&#xff1a;麒麟v10 CPU&#xff1a;rk3588 为了方便编译aarch64版本&#xff0c;建议x265版本选择3.5版本&#xff0c;此版本build中包含了aarch64配置选项&#xff0c;比较码放。下载地…

Building3D An Urban-Scale Dataset and Benchmarks 论文阅读

文章主页 Building3D 任务 提出了一个城市规模的数据集&#xff0c;由超过 16 万座建筑物以及相应的点云、网格和线框模型组成&#xff0c;覆盖爱沙尼亚的 16 个城市&#xff0c;面积约 998 平方公里。 动机 现有的3D建模数据集主要集中在家具或汽车等常见物体上。缺乏建…

CAPL入门之使用CAPL记录测试Logging

0 前言 以往测试的log都是直接从trace导出&#xff0c;但是最近发现trace中能导出的数据是有限的&#xff0c;如果测试的时间过长&#xff0c;新的数据就会把之前的数据全部覆盖&#xff0c;并且对于长时间的测试&#xff0c;直接导出trace的内容也会造成查找效率低下的问题。因…