当前位置: 首页 > news >正文

SpringBoot的测试方案

写完代码后,测试是必不可少的步骤,现在来介绍一下基于SpringBoot的测试方法。

基于SpringBoot框架写完相应功能的Controller之后,然后就可以测试功能是否正常,本博客列举MockMvcRestTemplate两种方式来测试。

准备代码

实体类Person

public class Person {private String id;private String name;public Person() {}public Person(String name) {this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + "]";}}

控制器PersonController

import javax.validation.Valid;import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import com.test.springboottest.bean.Person;@RestController
@RequestMapping("/person")
public class PersonController {/*** 使用对象方式传递数据* @param person 保存对象* @return*/@RequestMapping(value="/add",method=RequestMethod.POST)public Person addUser(Person person){person.setId(UUID.randomUUID().toString().substring(0, 6));return person;}/*** 使用JSON方式传递数据* @param person 保存对象* @return*/@RequestMapping(value="/addJson",method=RequestMethod.POST)public Person addUserByJson(@RequestBody Person person){person.setId(UUID.randomUUID().toString().substring(0, 6));return person;}@RequestMapping(value="/get/{id}",method=RequestMethod.GET)public Person getUser(@PathVariable String id){Person person = new Person("Mepper");person.setId(id);return person;}
}

上述代码即为简化版的数据的增查的功能。

MockMvc方式

import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;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.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;import com.fasterxml.jackson.databind.ObjectMapper;
import com.test.springboottest.bean.Person;@SpringBootTest//系统会自动加载Spring Boot容器
@RunWith(SpringRunner.class)
public class ControllerTest {//模拟http请求private MockMvc mockMvc;//用于将对象转换为json字符串private ObjectMapper mapper = new ObjectMapper();@Autowiredprivate WebApplicationContext context;@Beforepublic void setUp(){mockMvc = MockMvcBuilders.webAppContextSetup(context).build();}//测试数据获取@Testpublic void getPerson(){try {mockMvc.perform(MockMvcRequestBuilders.get("/person/get/2018001") //请求的url,请求的方法是get.accept(MediaType.APPLICATION_JSON_UTF8)).andDo(print());//打印出请求和相应的内容.andReturn().getResponse().getContentAsString(); //将相应的数据转换为字符串} catch (Exception e) {e.printStackTrace();}}//测试数据的添加@Testpublic void addPerson(){try {mockMvc.perform(MockMvcRequestBuilders.post("/person/add").param("name", "Apple") //添加参数.accept(MediaType.APPLICATION_JSON_UTF8)).andDo(print());} catch (Exception e) {e.printStackTrace();}}//测试JSON字符串的保存@Testpublic void addPersonByJson(){try {Person person = new Person("Banana");String requestBody = mapper.writeValueAsString(person);mockMvc.perform(MockMvcRequestBuilders.post("/person/addJson").contentType(MediaType.APPLICATION_JSON_UTF8)  //数据的格式.content(requestBody)  .accept(MediaType.APPLICATION_JSON_UTF8)).andDo(print());} catch (Exception e) {e.printStackTrace();}}
}
  • mockMvc.perform:执行一个RequestBuilder请求
  • MockMvcRequestBuilders.get:构造一个get请求。另外提供了其他的请求的方法,如:post、put、delete等
  • param:添加request的参数root的参数。假如使用需要发送json数据格式的时将不能使用这种方式,可见后面被@ResponseBody注解参数的解决方法
  • contentType:指定传递的数据类型
  • accept: 指定接受的数据类型
  • andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台(对返回的数据进行的判断)
  • andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断)

注意点

当使用JSON传递数据的时候,需要使用.contentType(MediaType.APPLICATION_JSON_UTF8).content(requestBody)的方式,
不然会发生org.springframework.http.converter.HttpMessageNotReadableException异常,因为相应方法只接受JSON数据格式。

RestTemplate方式

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;import com.test.springboottest.bean.Person;@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
public class ControllerRestTest {@Value("http://localhost:${local.server.port}/person")private String baseUrl;private RestTemplate restTemplate = new RestTemplate();@Testpublic void getPerson(){Person person=restTemplate.getForObject(baseUrl+"/get/001", Person.class);System.out.println(person);}@Testpublic void addPerson(){//当直接传递参数需要用mapMultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();paramMap.add("name", "Aster");Person person=restTemplate.postForObject(baseUrl+"/add", paramMap, Person.class);System.out.println(person);}@Testpublic void addPersonByJson(){try{Person p = new Person("Banana");Person person=restTemplate.postForObject(baseUrl+"/addJson", p, Person.class);System.out.println(person);}catch (Exception e) {e.printStackTrace();}}
}

相比而言,RestTemplate比MockMvc更加简单,更加清晰。

相关文章:

SpringBoot的测试方案

写完代码后&#xff0c;测试是必不可少的步骤&#xff0c;现在来介绍一下基于SpringBoot的测试方法。 基于SpringBoot框架写完相应功能的Controller之后&#xff0c;然后就可以测试功能是否正常&#xff0c;本博客列举MockMvc和RestTemplate两种方式来测试。 准备代码 实体类…...

华为OD机考算法题:字符串解密

目录 题目部分 解读与分析 代码实现 题目部分 题目字符串解密题目说明给定两个字符串string1和string2。 string1是一个被加扰的字符串。string1由小写英文字母&#xff08;a~z&#xff09;和数字字符&#xff08;0~9&#xff09;组成&#xff0c;而加扰字符串由0~9、a~f 组…...

unity 锚点设置

锚点聚合情况&#xff1a; 一个2d物体的位置 pos x pos y 是中心点相对于锚点的偏移量&#xff1a; 中心点就是位置。 按住shift 锚点和中心点都会被设置&#xff1a; 按住Alt&#xff1a; 同时按住shift和alt &#xff1a; 中心点 锚点 UI元素在对应的位置上。 锚点拉伸情况…...

Hadoop:HDFS--分布式文件存储系统

目录 HDFS的基础架构 VMware虚拟机部署HDFS集群 HDFS集群启停命令 HDFS Shell操作 hadoop 命令体系&#xff1a; 创建文件夹 -mkdir 查看目录内容 -ls 上传文件到hdfs -put 查看HDFS文件内容 -cat 下载HDFS文件 -get 复制HDFS文件 -cp 追加数据到HDFS文件中 -appendTo…...

自定义封装异步任务组件,实现FutureTask功能

FutureTask 在 JDK1.8 后的异步编排API中的CompletableFuture&#xff0c;提供了 异步任务的成功回调、异常回调。 public class FutureTaskTest {public static void main(String[] args) throws Exception {CompletableFuture<String> future CompletableFuture.sup…...

【区块链 | IPFS】IPFS节点搭建、文件上传、节点存储空间设置、节点上传文件chunk设置

一、创建ipfs节点 通过ipfs init在本地计算机建立一个IPFS节点 本文有些命令已经执行过了&#xff0c;就没有重新初始化。部分图片拷贝自先前文档&#xff0c;具体信息应以实物为准 ipfs init initializing IPFS node at /Users/CHY/.ipfs generating 2048-bit RSA keypair.…...

【autodesk】浏览器中渲染rvt模型

使用Forge完成渲染 Forge是什么 为什么能够渲染出来rvt模型 Forge是由Autodesk开发的一套云端开发平台和工具集。在Forge平台中&#xff0c;有一个名为"Model Derivative"的服务&#xff0c;它可以将包括RVT&#xff08;Revit&#xff09;在内的多种BIM&#xff08…...

Python超入门(1)__迅速上手操作掌握Python

# 1.第一个代码&#xff1a;输出语句 # 1.第一个代码&#xff1a;输出语句 print("My dogs name is Huppy!") print(o----) print( ||| ) print("*" * 10) """ 输出结果&#xff1a; My dogs name is Huppy! o----||| ********** "&…...

后端面试话术集锦第 十四 篇:go语言面试话术

这是后端面试集锦第十四篇博文——go语言面试话术❗❗❗ 1. go数组、切片、扩容 go的数组和切片都是用来存储相同类型的数据集合。 数组是存储固定大小的集合,且为值引用。 但切片是存储无固定大小的集合,且为引用类型。 切片有三个属性,分别为指向指针的数组array,数组…...

Oralce集群管理-19C RAC 私有网络调整为BOND1

1 尝试在线添加私有网络的新接口 是否成功。 使用oifcfg命令在线添加新的网卡接口&#xff0c;在还没有配置bond1的条件下 也是可以添加成功的。 [gridorcldb1 ~]$ oifcfg getif eno3 192.168.224.0 global public ens3f0 10.2.0.0 global cluster_interconnect,asm eno…...

洛谷 Array 数论

题目&#xff1a; 对于长度为n的数组A&#xff0c;A中只包含从1到n的整数&#xff08;可重复&#xff09;。如果A单调不上升或单调不下降&#xff0c;A就可称为美丽的。 找出在长度为n时&#xff0c;有几个美丽的A。 思路&#xff1a; 这是一道数论题。 我们先找找“单调不递…...

简明SQL条件查询指南:掌握WHERE实现数据筛选

条件查询是用于从数据库中根据特定条件筛选数据行的一种方式&#xff0c;它避免了检索整个表中的数据。通常&#xff0c;使用 WHERE 子句来定义过滤条件&#xff0c;只有符合这些条件的数据行才会被返回。 SQL中的运算符有&#xff1a;、!、<、> 等&#xff0c;用于进行…...

通过HbaseClient来写Phoenix表实现

由于数据存储在Hbase上&#xff0c;并且上层使用了Phoenix来读写数据。并且由于数据的列字段不固定&#xff0c;并且可能由于Hbase表列和Phoenix的表列字段不一致&#xff0c;使用Phoenix写入的数据会导致写出报错的问题出现。所以这里直接使用HbaseClient写入到Hbase表中&…...

uniapp qiun charts H5使用echarts的eopts配置不生效

原因是&#xff1a;使用web的要设置 echartsH5 :echartsH5"true" <template><view class"charts-box"><view class"chart-title"> 趋势</view><qiun-data-chartstype"column":eopts"eopts":cha…...

嵌入式Linux驱动开发(LCD屏幕专题)(三)

1. 硬件相关的操作 LCD驱动程序的核心就是&#xff1a; 分配fb_info设置fb_info注册fb_info硬件相关的设置 硬件相关的设置又可以分为3部分&#xff1a; 引脚设置时钟设置LCD控制器设置 2. 在设备树里指定LCD参数 framebuffer-mylcd {compatible "100ask,lcd_drv&qu…...

MySQL视图用户管理

文章目录 视图视图的规则用户用户信息创建用户删除用户修改密码 用户权限给用户授权回收权限 视图 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会…...

我发现了一个很好看的字体,霞鹜文楷!如何换windows和typora字体?

1、字体 官方地址如下&#xff0c;下载也很简单。 https://github.com/lxgw/LxgwWenKai 有1W多的stars。 方式&#xff1a; 直接打包下载。下载不来&#xff0c;可以联系我。 然后ttf的文件&#xff0c;全部安装就行了。 reg save "HKCU\Control Panel" .\res…...

微软8月系统更新引发问题:虚拟内存分页文件出现错误

微软的八月系统更新引发了一系列问题&#xff0c;其中包括“UNSUPPORTED_PROCESSOR”蓝屏错误和文件管理器故障。尽管微软已经修复了前者&#xff0c;但据国外科技媒体Windows Latest报道&#xff0c;仍有用户反馈在非微星设备上出现“fault in nonpaged area”蓝屏错误。 如果…...

swiper删除虚拟slide问题

在存在缓存的情况下&#xff0c;删除较前的slide&#xff0c;会出现当前slide与后一个slide重复出现的情况 假设当前存在5个slide&#xff0c;且这5个slide已缓存&#xff0c;则删除slide2后&#xff0c;仍为5个slide&#xff0c;且slide2的内容变为slide3的内容&#xff0c;此…...

FPGA实战小项目2

基于FPGA的贪吃蛇游戏 基于FPGA的贪吃蛇游戏 基于fpga的数字密码锁ego1 基于fpga的数字密码锁ego1 基于fpga的数字时钟 basys3 基于fpga的数字时钟 basys3...

终极指南:如何为Figma安装中文界面插件,让设计工作更高效

终极指南&#xff1a;如何为Figma安装中文界面插件&#xff0c;让设计工作更高效 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN FigmaCN是一款专为中文用户设计的Figma界面汉化插件&am…...

OpenClaw批量处理:千问3.5-9B同时操作百个Excel文件

OpenClaw批量处理&#xff1a;千问3.5-9B同时操作百个Excel文件 1. 为什么需要测试Excel批量处理&#xff1f; 上个月我需要整理一批市场调研数据——237个Excel文件&#xff0c;每个文件包含20-50张工作表。手动操作需要反复执行"打开文件→复制数据→粘贴到汇总表→保…...

OpenClaw技能扩展:安装Qwen3-4B专用插件实现代码生成

OpenClaw技能扩展&#xff1a;安装Qwen3-4B专用插件实现代码生成 1. 为什么需要Qwen3-4B专用技能 作为一个长期与代码打交道的开发者&#xff0c;我一直在寻找能够提升编码效率的工具。当我第一次接触OpenClaw时&#xff0c;最吸引我的不是它的基础自动化能力&#xff0c;而是…...

类OpenClaw智能体优选指南,企业级+个人级全覆盖

2026年初&#xff0c;OpenClaw开源智能体框架凭借“自主规划、工具调用、端到端执行”的核心能力&#xff0c;打破传统AI“只对话不行动”的壁垒&#xff0c;在GitHub迅速斩获25万星标&#xff0c;引发全球科技圈热潮&#xff0c;国内厂商纷纷入局推出类OpenClaw产品&#xff0…...

利用快马平台AI能力,十分钟快速生成qoderwork官网原型

最近在尝试为AI代码生成工具qoderwork设计官网原型时&#xff0c;发现用传统方式从零开始写代码特别耗时。正好体验了InsCode(快马)平台的AI生成功能&#xff0c;十分钟就做出了可交互的响应式单页原型&#xff0c;分享下这个高效的工作流&#xff1a; 明确核心模块 官网原型需…...

农业AI实践:OpenClaw+Qwen2.5-VL-7B识别病虫害图片

农业AI实践&#xff1a;OpenClawQwen2.5-VL-7B识别病虫害图片 1. 为什么选择OpenClaw做农业病虫害识别&#xff1f; 去年夏天&#xff0c;我在自家后院种植的番茄突然出现叶片发黄、边缘卷曲的现象。作为非专业农户&#xff0c;我翻遍植物病理学资料仍无法确诊&#xff0c;直…...

从ARXML文件反推软件架构:一个ComM模块的配置实例如何映射到你的C代码

从ARXML到C代码&#xff1a;ComM模块配置的逆向工程实战 当你第一次打开ComM_Cfg_SWCD.arxml文件时&#xff0c;那些层层嵌套的XML标签是否让你感到无从下手&#xff1f;作为AUTOSAR开发中最关键的配置文件之一&#xff0c;ARXML实际上是一张精确的"施工图纸"&#x…...

社交媒体数据采集难题?MediaCrawler让复杂任务变简单

社交媒体数据采集难题&#xff1f;MediaCrawler让复杂任务变简单 【免费下载链接】MediaCrawler-new 项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler-new 在信息爆炸的数字时代&#xff0c;企业、研究机构和内容创作者常常需要从各大社交平台获取有价…...

从零开始掌握drawio:免费开源绘图工具的全方位指南

1. 为什么你需要drawio这款绘图神器 第一次接触drawio是在三年前的一个项目会议上&#xff0c;当时团队需要快速绘制一套系统架构图。同事随手打开浏览器输入app.diagrams.net&#xff0c;五分钟内就搭建出了清晰的流程图框架。那一刻我才发现&#xff0c;原来专业绘图可以如此…...

颠覆式项目管理工具GanttProject:让团队协作效率提升300%的开源解决方案

颠覆式项目管理工具GanttProject&#xff1a;让团队协作效率提升300%的开源解决方案 【免费下载链接】ganttproject Official GanttProject repository 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject GanttProject是一款完全免费的开源甘特图工具&#xff…...