Springboot @Test 给Controller接口 写 单元测试

news/2024/9/9 9:37:02/

前言


最近有小伙伴问到怎么给 controller的接口写单元测试。

 

单元测试是开发必不可少的一个环节。

既然有人问到了,那我觉得可能不止一个人不会,那就按照惯例,出手。

 

正文


内容:

主要是get 和 post 两种请求方式的接口 的 单元测试写法。

get方式请求   介绍 3种传参:


①@PathVariable
②@RequestParam("id")
③类传参 如 User user

post方式请求  介绍 1种传参:
@RequestBody

@RequestHeader请求头参数添加参数


上代码 :


先看GET方式请求,简单写三个示例接口

    @GetMapping("/getId/{id}")public String pathVariableTest(@PathVariable Integer id) {return  "id:   "+id;}@GetMapping("/getId")public String requestParamTest( @RequestParam("id") Integer id) {return  "id:   "+id;}@GetMapping("/getUser")public String requestParamObjectTest( User user) {return  user.toString();}

然后我们来针对这三个get请求接口写单元测试

pom.xml 加入测试使用的jar依赖

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

创建一个单元测试类 MyControllerTest.java

 代码:

import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class MyControllerTest {protected Logger logger = LoggerFactory.getLogger(MyControllerTest.class);
}

 写下来开始写 针对controller 的 单元测试代码:

 代码:

    @AutowiredDoTestController doTestController;private MockMvc mockMvc;@Beforepublic void setup() {mockMvc = MockMvcBuilders.standaloneSetup(doTestController).build();}

 

首先针对这种场景的GET请求,传入参数的,我们怎么写单测?

 @RequestParam("id")


 代码: 

    @Testpublic void getTest() throws Exception {MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/getId").param("id", "123")).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();logger.info("调用返回的结果:{}", mvcResult.getResponse().getContentAsString());}

ps: 多个  @RequestParam  就同样 一直 .param即可

示例:

 当然也可以通过map传值,传多个:

 

 跑一下单测看看效果:

 

然后是@PathVariable 传参方式:

 单测写法:

 代码:

    @Testpublic void pathVariableTest() throws Exception {Integer id = 888;MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/getId/" + id)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();logger.info("调用返回的结果:{}", mvcResult.getResponse().getContentAsString());}

 

然后是传类的情景:

  单测写法:

代码:
 

    @Testpublic void getTestObject() throws Exception {MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/getUser").param("userId", "123").param("name", "JCccc").param("age", "18").param("userCode", "100244").contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();logger.info("调用返回的结果:{}", mvcResult.getResponse().getContentAsString());}

然后看下POST 请求方式的接口 单测写法

 

顺便把请求头参数方式一并写了:

 代码:
 

    @Testpublic void postTest() throws Exception {User user = new User();user.setUserId(100011L);user.setName("JCccc");user.setUserCode("100244");user.setAge(18);String strJson = JSON.toJSONString(user);MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/getRequestBodyValue").header("token", "收藏点赞").accept(MediaType.parseMediaType("application/json;charset=UTF-8")).contentType(MediaType.APPLICATION_JSON).content(strJson)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();logger.info("调用返回的结果:{}", mvcResult.getResponse().getContentAsString());}

效果:

 


http://www.ppmy.cn/news/26802.html

相关文章

Vue3 中生命周期的使用

目录前言&#xff1a;一、什么是生命周期函数二、什么是 Keep-Alive 组件三、生命周期函数分为几种&#xff0c;分别有什么用&#xff1f;1. beforeCreate2. created3. beforeMount/onBeforeMount4. mounted/onMounted5. beforeUpdate/onBeforeUpdate6. updated/onUpdated7. be…

技术栈入门------ElasticSearch

使用ElasticSearch的准备工作一、在Linux上安装ElasticSearch1、docker下载elasticSearch和kibana的镜像docker pull elasticsearch:7.4.2 存储和检索数据 docker pull kibana:7.4.2 可视化检索数据2、创建目录mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasti…

9、GPT-1-2-3

GPT GPT系列即基于Transformer Decoder实现的预训练语言模型&#xff0c;在各类复杂的NLP任务中都取得了不错的效果&#xff0c;如文章生成、代码生成、机器翻译&#xff0c;Q&A等。 对于一个新的任务&#xff0c;GPT仅仅需要非常少的数据便可以理解该任务&#xff0c;并…

【Java】Spring核心与设计思想

文章目录Spring核心与设计思想1. Spring是什么1.1 什么是容器1.2 什么是IOC1.2.1 传统程序开发1.2.2 控制反转式程序开发1.2.3 对比总结规律1.3 理解Spring IOC1.4 DI概念说明Spring核心与设计思想 1. Spring是什么 我们通常所说的Spring指的是Spring Framework&#xff08;S…

MyBatis概述环境搭建(一)

&#x1f697;MyBatis学习起始站~ &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 &#x1f44d;希望您能有所收获 一.什么是MyBatis (1) 引言 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDB…

02-04 周六 图解机器学习 SVM 支持向量机分类学习

02-04 周六 图解机器学习 SVM 支持向量机分类学习时间版本修改人描述2023年2月4日11:15:16V0.1宋全恒新建文档 环境搭建 首先搭建jupyter环境&#xff0c;方便可视化 (base) rootnode33-a100:~# docker run --name sqh-learn -d -p 10088:8888 -it 10.101.12.128/framework/ju…

生态应用:探讨 NGINX 与上下游系统集成时的开发经验

NGINX 作为一款高性能的 Web 服务器和反向代理服务器&#xff0c;在各种应用场景中广泛应用。随着业务的发展&#xff0c;我们在使用 NGINX 时&#xff0c;可能需要将其与其他系统进行集成&#xff0c;以实现更加复杂的业务需求。 本文将结合实际应用场景&#xff0c;探讨 NGI…

带你一步步搭建Web自动化测试框架

测试框架的设计有两种思路&#xff0c;一种是自底向上&#xff0c;从脚本逐步演变完善成框架&#xff0c;这种适合新手了解框架的演变过程。另一种则是自顶向下&#xff0c;直接设计框架结构和选取各种问题的解决方案&#xff0c;这种适合有较多框架事件经验的人。本章和下一张…

Linux之网络流量监控工具ntopng YUM安装

一、ntopng简介 Ntop是一种监控网络流量工具&#xff0c;用ntop显示网络的使用情况比其他一些网络管理软件更加直观、详细。Ntop甚至可以列出每个节点计算机的网络带宽利用率。他是一个灵活的、功能齐全的&#xff0c;用来监控和解决局域网问题的工具&#xff1b;尤其当ntop与n…

非标题党:前端Vue React 项目编程规范化配置(大厂规范)

前端项目编程规范化配置 下述例子主要是从 代码规范化 以及 git 提交规范化 两方面进行配置。内容很多&#xff0c;请做好心理准备 一、代码检测工具 ESLint 在我们通过 vue create “项目名” 时&#xff0c;我们可以通过手动配置的方式&#xff0c;来配置 ESLint 来对代码进…

python 绘图 —— 绘制从顶部向底部显示的柱形图[ax.bar()]

python 绘图 —— 绘制从顶部向底部显示的柱形图[ax.bar()] 效果图如下所示&#xff1a; 就是这个样子&#xff0c;一般比较少见将柱形图从上往下绘制的。可能是会为了更好的展示数据对比结果吧。这里绘图的主要思路如下&#xff1a; 利用ax.twinx()这个函数生成一个新的x轴…

双因素方差分析全流程

上篇文章讲述了“单因素方差分析全流程总结”&#xff0c;单因素方差分析只是考虑了一个自变量&#xff08;定类&#xff09;与一个因变量&#xff08;定量&#xff09;之间的关系&#xff0c;但是在实际问题研究中可能研究两个或者几个因素与因变量之间的关系&#xff0c;例如…

鼠标指针文件格式解析

鼠标指针文件格式解析 文章目录鼠标指针文件格式解析windowsico文件格式分析文件头&#xff1a;图像数据头段&#xff1a;图像数据段&#xff1a;Ani动态光标格式解析数据结构&#xff1a;anihseq **rate**LISTcur静态光标文件格式解析macOSLinuxwindows ico文件格式分析 是一…

1-MATLAB APP Design-图像的输入与输出

一、APP 界面设计展示 新建一个空白的APP,在此次的学习中,我们会用到编辑字段(文本框)、 按钮、坐标区和面板,首先在界面中拖入一个编辑字段(文本框),在文本框中输入内容:图形的输入与输出,调整背景颜色,字体的颜色为黑色,字体的大小调为25.

UG NX二次开发(C#)-CAM-不再高亮显示所有的加工特征(CAMFeature)

文章目录 1、前言2、加工特征高亮显示的示例3、获取加工特征的几何对象3.1 获取面对象并取消高亮显示3.2 获取坐标系对象并取消高亮显示4、创建一个不再高亮显示所有加工特征的方法1、前言 当我们在识别加工特征后,其默认状态是被选中的,所以是高亮显示;当我们不再选中时,…

06- OpenCV查找图像轮廓 (OpenCV基础) (机器视觉)

知识重点 灰度图转换: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)二值化: 返回两个东西&#xff0c;一个阈值&#xff0c; 一个是二值化的图: thresh, binary cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)查找轮廓: 返回两个结果&#xff0c;分别是轮廓和层级: c…

【C语言】浮点型数据在内存中的存储

&#x1f680;&#x1f680;&#x1f680; 如果文章对你有帮助不要忘记点赞关注收藏哦&#x1f680;&#x1f680;&#x1f680; 文章目录⭐浮点数在内存中的存储1.1 &#x1f913;举个例子:1.2浮点数存储规则&#x1f308;&#xff1a;对于M与E有一些特别规定1.3解释前面题目&…

STM32开发(11)----CubeMX配置独立看门狗(IWDG)

CubeMX配置独立看门狗&#xff08;IWDG&#xff09;前言一、独立看门狗的介绍二、实验过程1.STM32CubeMX配置独立看门狗2.代码实现3.硬件连接4.实验结果总结前言 本章介绍使用STM32CubeMX对独立看门狗定时器进行配置的方法。门狗本质上是一个定时器&#xff0c;提供了更高的安…

嵌入式Qt 开发一个视频播放器

上篇文章&#xff1a;嵌入式 Qt开发一个音乐播放器&#xff0c;使用Qt制作了一个音乐播放器&#xff0c;并在OK3568开发板上进行了运行测试&#xff0c;实际测试效果还不错。 本篇继续来实现一个Qt视频播放器软件&#xff0c;可以实现视频列表的显示与选择播放等&#xff0c;先…

centos7下用kvm启动Fedora36 Cloud镜像

环境 os:centos7 Arch: aarch64 安装qemu-kvm yum install qemu-kvm kvm virt-install libvirt systemctl start libvirtd.service创建镜像 下载aarch64架构的Fedora36镜像 wget https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/36/Cloud/aarch64/images/Fedora-Cl…