SpringBoot 如何使用 MockMvc 进行 Web 集成测试

SpringBoot 如何使用 MockMvc 进行 Web 集成测试

介绍

SpringBoot 是一个流行的 Java Web 开发框架,它提供了一些强大的工具和库,使得开发 Web 应用程序变得更加容易。其中之一是 MockMvc,它提供了一种测试 SpringBoot Web 应用程序的方式,可以模拟 HTTP 请求和响应的行为。

在本文中,我们将介绍 SpringBoot 中的 MockMvc,演示如何使用它进行 Web 集成测试。

在这里插入图片描述

MockMvc

MockMvc 是 SpringFramework 中的一个测试工具,用于模拟 HTTP 请求和响应的行为。MockMvc 可以模拟发送 GET、POST、PUT、DELETE 等 HTTP 请求,并验证响应的状态码、内容类型和响应体等。

在 SpringBoot 中,我们可以使用 MockMvc 进行 Web 集成测试。下面是一个简单的例子:

@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {@Autowiredprivate MockMvc mockMvc;@Testpublic void testGetUser() throws Exception {mockMvc.perform(get("/users/{id}", 1)).andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON)).andExpect(jsonPath("$.id").value(1)).andExpect(jsonPath("$.name").value("John Doe")).andExpect(jsonPath("$.age").value(25));}
}

在上面的代码中,我们使用 @SpringBootTest 和 @AutoConfigureMockMvc 注释 SpringBoot 应用程序和 MockMvc。然后,我们使用 @Autowired 注释注入 MockMvc 对象。最后,我们使用 perform 方法模拟发送 GET 请求,并使用 andExpect 方法验证响应的状态码、内容类型和响应体等。

如何使用 MockMvc 进行 Web 集成测试

要使用 MockMvc 进行 Web 集成测试,请按照以下步骤操作:

第 1 步:添加依赖

在 pom.xml 文件中添加以下依赖:

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

在上面的代码中,我们添加了一个 spring-boot-starter-test 依赖,它包含了许多测试相关的依赖。

第 2 步:启用 MockMvc

在测试类中添加 @SpringBootTest 和 @AutoConfigureMockMvc 注释启用 MockMvc。

@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {...
}

在上面的代码中,我们使用 @SpringBootTest 注释启用 SpringBoot 应用程序,并使用 @AutoConfigureMockMvc 注释启用 MockMvc。

第 3 步:注入 MockMvc 对象

在测试类中使用 @Autowired 注释注入 MockMvc 对象。

@Autowired
private MockMvc mockMvc;

在上面的代码中,我们使用 @Autowired 注释注入 MockMvc 对象。

第 4 步:模拟 HTTP 请求

使用 MockMvc 对象的 perform 方法模拟 HTTP 请求。

mockMvc.perform(get("/users/{id}", 1))

在上面的代码中,我们使用 get 方法模拟发送 GET 请求。在路径中使用占位符 {id},可以在后面的参数列表中指定实际的 id 值。

第 5 步:验证响应状态码

使用 andExpect 方法验证响应的状态码。

.andExpect(status().isOk())

在上面的代码中,我们使用 status 方法获取响应的状态码,并使用 isOk 方法验证状态码是否为 200。

第 6 步:验证响应内容类型

使用 andExpect 方法验证响应的内容类型。

.andExpect(content().contentType(MediaType.APPLICATION_JSON))

在上面的代码中,我们使用 content 方法获取响应的内容类型,并使用 contentType 方法验证内容类型是否为 JSON。

第 7 步:验证响应体

使用 andExpect 方法验证响应的内容。

.andExpect(jsonPath("$.id").value(1))
.andExpect(jsonPath("$.name").value("John Doe"))
.andExpect(jsonPath("$.age").value(25));

在上面的代码中,我们使用 jsonPath 方法获取响应体中的 JSON 属性,并使用 value 方法验证属性的值是否正确。

示例

以下是一个完整的示例:

UserController.java

@RestController
@RequestMapping("/users")
public class UserController {private List<User> users = new ArrayList<>();@GetMapping("/{id}")public User getUser(@PathVariable int id) {return users.stream().filter(user -> user.getId() == id).findFirst().orElse(null);}@PostMappingpublic User createUser(@RequestBody User user) {int nextId = users.size() + 1;user.setId(nextId);users.add(user);return user;}@PutMapping("/{id}")public User updateUser(@PathVariable int id, @RequestBody User user) {User existingUser = users.stream().filter(u -> u.getId() == id).findFirst().orElse(null);if (existingUser != null) {existingUser.setName(user.getName());existingUser.setAge(user.getAge());}return existingUser;}@DeleteMapping("/{id}")public void deleteUser(@PathVariable int id) {users.removeIf(user -> user.getId() == id);}}

UserControllerTest.java

@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {@Autowiredprivate MockMvc mockMvc;@Testpublic void testGetUser() throws Exception {mockMvc.perform(get("/users/{id}", 1)).andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON)).andExpect(jsonPath("$.id").value(1)).andExpect(jsonPath("$.name").value("John Doe")).andExpect(jsonPath("$.age").value(25));}@Testpublic void testCreateUser() throws Exception {User user = new User();user.setName("Jane Doe");user.setAge(30);mockMvc.perform(post("/users").contentType(MediaType.APPLICATION_JSON).content(asJsonString(user))).andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON)).andExpect(jsonPath("$.id").isNumber()).andExpect(jsonPath("$.name").value("Jane Doe")).andExpect(jsonPath("$.age").value(30));}@Testpublic void testUpdateUser() throws Exception {User user = new User();user.setName("Jane Doe");user.setAge(30);mockMvc.perform(put("/users/{id}", 1).contentType(MediaType.APPLICATION_JSON).content(asJsonString(user))).andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON)).andExpect(jsonPath("$.id").value(1)).andExpect(jsonPath("$.name").value("Jane Doe")).andExpect(jsonPath("$.age").value(30));}@Testpublic void testDeleteUser() throws Exception {mockMvc.perform(delete("/users/{id}", 1)).andExpect(status().isOk());mockMvc.perform(get("/users/{id}", 1)).andExpect(status().isOk()).andExpect(content().string(""));}private String asJsonString(Object obj) {try {ObjectMapper mapper = new ObjectMapper();return mapper.writeValueAsString(obj);} catch (Exception e) {throw new RuntimeException(e);}}}

在上面的示例中,我们创建了一个 UserController 类,并实现了 GET、POST、PUT 和 DELETE 方法。然后,我们创建了一个 UserControllerTest 类,并使用 MockMvc 对象模拟发送 HTTP 请求,并验证响应的状态码、内容类型和响应体等。我们还定义了一个 asJsonString 方法,用于将对象转换为 JSON 字符串。

结论

使用 MockMvc 进行 Web 集成测试是一种方便快捷的方式,可以有效地测试 SpringBoot Web 应用程序的功能。在本文中,我们介绍了 MockMvc 的基本概念和用法,并演示了如何使用 MockMvc 进行 Web 集成测试。如果你正在开发 SpringBoot Web 应用程序,建议你使用 MockMvc 进行集成测试,以确保你的应用程序能够正常工作。

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

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

相关文章

Microsoft Remote Desktop for mac安装教程

适用于Mac的Microsoft远程桌面测试版&#xff01;Microsoft Remote Desktop Beta for Mac是一种远程工具&#xff0c;允许用户从Mac远程访问基于Windows的计算机。使用此工具&#xff0c;用户可以随时随地使用Mac连接到远程桌面、应用程序和资源。 Microsoft Remote Desktop B…

2023年Arm最新处理器架构分析——X4、A720和A520

1、引言 上一篇文章我们介绍了Arm的Cortex-X1至Cortex-X3系列处理器&#xff0c;2023年的5月底&#xff0c;Arm如期发布了新一年的处理器架构&#xff0c;分别为超级大核心Cortex-X4&#xff0c;大核心A720和小核心A520。在智能手机行业&#xff0c;Arm始终保持每年一迭代的处…

【GCD+MST】ABC210 E

这道题告诉我们&#xff0c;一道题一定要去手摸样例&#xff0c;多造几个数据&#xff0c;然后找思路 很多时候&#xff0c;题目看错了&#xff0c;码完发现思路错了&#xff0c;调半天调不出来&#xff0c;思路一直在旧框架打转&#xff0c;这些情况都是不去考察实际情况导致…

超速Python编程:利用缓存加速你的应用程序

引言 在软件开发中&#xff0c;缓存是一种常用的技术&#xff0c;用于提高系统性能和响应速度。Python提供了多种缓存技术和库&#xff0c;使我们能够轻松地实现缓存功能。本文将带您从入门到精通&#xff0c;逐步介绍Python中的缓存使用方法&#xff0c;并提供实例演示。 1.…

《MySQL》复合查询和连接

文章目录 查询单行子查询多行子查询合并查询 连接内连接外连接 点睛之笔&#xff1a;无论是多表还是单表&#xff0c;我们都可以认为只有一张表。 只要是表&#xff0c;就可以查询和连接成新表&#xff0c;所以select出来的结果都可以认为成一张表&#xff0c;既然是一张表&…

WAIC2023会后记

听了3天WAIC的会&#xff0c; 大开眼界&#xff0c;算是上了堂大课。 本次参会的目的是听听AI企业信息化的想法、理论和实践。以进一步探索可能的业务场景。三天的会结束后&#xff0c;留下深刻印象的有如下几点。 大模型当道 2023这次大会的主题成了大模型&#xff0c;谈的…

ElasticSearch学习笔记一——下载及安装

最近发现ES是个很重要的内容啊&#xff0c;各种大厂都会使用ES来做一些大范围的搜索之类的功能&#xff0c;所以今天我们也来学习一下。 首先我们要准备Java的环境&#xff0c;推荐版本8、11、14 ES官方的JDK兼容性列表(有些慢&#xff0c;需要耐心等待一下哈) 在我写文章时&…

iview-admin使用小结

首先在使用一个框架之前一定要完整的看一下相关文档&#xff0c;因为框架中会封装常用的功能&#xff0c;也会更加符合大众要求。在ui设计图上&#xff0c;可能实现某个功能设计图中给出的交互并不是很好&#xff0c;而在框架中有更好的组件可以实现&#xff0c;但因为没有看文…

Python中的迭代器

一、介绍 在Python中&#xff0c;迭代器是一种访问集合元素的方式&#xff0c;可以用于遍历数据集中的元素&#xff0c;而不需要事先知道集合的大小。迭代器可以被用于循环语句中&#xff0c;例如for循环&#xff0c;来遍历集合中的每个元素。 Python中的迭代器是一个实现了迭…

Wholebody 3D keypoint估计:从H3WB开始

目录 前言一、&#xff28;&#xff13;&#xff37;&#xff22;1.下载2.标注格式3.任务分析验证评估 总结 前言 这份工作是首次尝试去检测&#xff13;D全人体姿态的工作&#xff0e;我们使用的数据集是基于Human3.6M的&#xff13;&#xff24;全人体关键点数据集&#xff…

HTML元素中有中文、英文、符号、数字。第一行没排满就自动换行的解决办法:word-break:break-all的使用

word-break: break-all 是一个CSS属性&#xff0c;用于控制文本在容器中的换行方式。它的作用是强制在任意字符之间进行换行&#xff0c;即使这样可能会导致单词被分割。 具体来说&#xff0c;word-break 属性有以下几个取值&#xff1a; normal&#xff08;默认值&#xff09…

Ubuntu 包管理的 20 个“apt-get”命令

动动发财的小手&#xff0c;点个赞吧&#xff01; 在引入 apt 命令之前&#xff0c;apt-get 命令是基于 Debian 的 Linux 发行版中使用的主要包管理命令。 使用 apt-get 命令&#xff0c;您可以在系统上安装、删除、升级、搜索和管理软件包。然而&#xff0c;从 Ubuntu 16.04 和…