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

news2024/9/24 1:25:07

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 {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public 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);
    }

    @PostMapping
    public 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 {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public 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));
    }

    @Test
    public 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));
    }

    @Test
    public 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));
    }

    @Test
    public 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.coloradmin.cn/o/735255.html

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

相关文章

实测:python字典迭代比列表迭代快

具体原因可以参考&#xff1a;Python中字典比列表快的原因是什么 - 风纳云 (fengnayun.com) 再补充一点&#xff0c;字典的键可以直接迭代&#xff0c;但是value不行。 此时红色框部分似乎dict&#xff0c;速度很快&#xff1b; 但是当换成列表的时候 &#xff1a; 有一点外…

线性表的链式表示和实现

链式表示中各节点由两个域组成&#xff1a; 数据域&#xff1a;存储元素值数据 指针域&#xff1a;存储直接后继节点的存储位置 头指针、头节点、首元节点&#xff1a;示意图 头指针&#xff1a;是指向链表中第一个节点的指针 首元节点&#xff1a;是链表中存储第一个数据元素…

【Unity3D】动态路径特效

1 前言 本文通过导航系统&#xff08;NavMeshAgent&#xff09;和线段渲染器&#xff08;LineRenderer&#xff09;实现了角色走迷宫和绘制路径功能&#xff0c;同时实现动态路径特效。 导航系统的介绍详见博客&#xff1a;导航系统、分离路面导航、动态路障导航。线段渲染器的…

RV1126笔记三十七:PaddleOCR检测模型训练

若该文为原创文章&#xff0c;转载请注明原文出处。 PaddleOCR检测模型训练及验证测试 1、准备数据集 在PaddleOCR目录下新建文件夹&#xff1a;train_data, 这个文件夹用于存放数据集的。 使用的是网上大佬提供的车牌识别数据集&#xff0c;下载后&#xff0c;解压到train…

《机器学习公式推导与代码实现》chapter21-贝叶斯概率模型

《机器学习公式推导与代码实现》学习笔记&#xff0c;记录一下自己的学习过程&#xff0c;详细的内容请大家购买作者的书籍查阅。 贝叶斯概率模型 1 贝叶斯定理简介 贝叶斯定理认为任意未知量 θ \theta θ都可以看做一个随机变量&#xff0c;对该未知量的描述可以用一个概率…

如何编写联邦学习训练框架——Pytorch实现

联邦学习框架实现 联邦学习训练过程由服务器和客户端两部分组成。 客户端将本地数据训练得到的模型上传服务器&#xff0c;服务器通过聚合客户端上传的服务器再次下发新一轮的模型&#xff0c;原理很简单&#xff0c;那么我们开始动手写代码。 1. 客户端部分&#xff1a; 客…

LVS - DR群集

文章目录 一、DR模式 LVS负载均衡群集1.数据包流向分析 二、LVS-DR模式的特点三、LVS-DR中的ARP问题四、DR模式 LVS负载均衡群集部署1.环境准备2.配置负载调度器&#xff08;192.168.40.104&#xff09;2.1.配置虚拟 IP 地址&#xff08;VIP&#xff1a;192.168.40.180&#xf…

RabbitMQ在SpringBoot中的高级应用(1)

启动RabbitMQ 1. 在虚拟机中启动RabbitMQ,要先切换到root用户下: su root 2.关闭防火墙: systemctl stop firewalld 3.rabbitmq-server start # 启用服务 4.rabbitmq-server -detached # 后台启动 1.消息确认机制 有两种确认的方式: 自动ACK:RabbitMQ将消息发送给…

一些有意思的耗尽型MOS恒流源阻抗对比

貌似没有什么管子能超过DN2540&#xff0c;测试的环境差别不大&#xff0c;LD1014D因为本身耐压太低&#xff08;25V&#xff09;&#xff0c;而且达不到1mA这个值&#xff0c;因此&#xff0c;测试的时候相应降低了电压&#xff0c;选择了2mA的电流&#xff0c;并将负载电阻减…

Pytorch-ResNet50-MINIST Classify 网络实现流程

分两个文件讲解&#xff1a;1、train.py训练文件 2、test.py测试文件. 1、train.py训练文件 1&#xff09;从主函数入口开始&#xff0c;设置相关参数 # 主函数入口 if __name__ __main__:# ----------------------------## 是否使用Cuda# 没有GPU可以设置成Fasle# -…

IDEA+SpringBoot+mybatis+bootstrap+jquery+Mysql车险理赔管理系统

IDEASpringBootmybatisbootstrapjqueryMysql车险理赔管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.编辑个人信息3.用户管理4.添加用户5.申请理赔管理6.赔偿金发放管理7.待调查事故保单8.已调查记录9.现场勘察管理10.勘察记录11.我的保险管理12.我的理赔管理 三…

Atcoder Beginner Contest 309——D-F讲解

前言 由于最近期末考试&#xff0c;所以之前几场都没打&#xff0c;给大家带了不便&#xff0c;非常抱歉。 这个暑假&#xff0c;我将会持续更新&#xff0c;并给大家带了更好理解的题解&#xff01;希望大家多多支持。 由于&#xff0c; A ∼ C A\sim C A∼C 题比较简单&am…

现代C++新特性 扩展的聚合类型(C++17 C++20)(PC浏览效果更佳)

文字版PDF文档链接&#xff1a;现代C新特性(文字版)-C文档类资源-CSDN下载 1.聚合类型的新定义 C17标准对聚合类型的定义做出了大幅修改&#xff0c;即从基类公开且非虚继承的类也可能是一个聚合。同时聚合类型还需要满足常规条件。 1&#xff0e;没有用户提供的构造函数。…

用C语言写一个压缩文件的程序

本篇目录 数据在计算机中的表现形式huffman 编码将文件的二进制每4位划分&#xff0c;统计其值在文件中出现的次数构建二叉树搜索二叉树的叶子节点运行并输出新的编码文件写入部分写入文件首部写入数据部分压缩运行调试解压缩部分解压缩测试为可执行文件配置环境变量总结完整代…

23数字图像置乱技术(matlab程序)

1.简述 一、引言 所谓“置乱”&#xff0c;就是将图像的信息次序打乱&#xff0c;a像素移动到b像素位置上&#xff0c;b像素移动到c像素位置上&#xff0c;……&#xff0c;使其变换成杂乱无章难以辨认的图片。数字图像置乱技术属于加密技术&#xff0c;是指发送发借助数学或者…

Python实现PSO粒子群优化算法优化Catboost分类模型(CatBoostClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

《低代码指南》——轻流5.0发布,无代码引擎矩阵全面升级

7月6日,由轻流主办「无代码无边界 202376Day|轻流无代码探索者大会」于上海顺利举行。轻流也在会上重磅发布了更加开放、灵活、低门槛的轻流5.0,和全面升级的专有轻流。 轻流5.0全面迭代升级了轻流的无代码引擎矩阵(表单引擎、流程引擎、报表引擎、门户引擎、数据引擎)。…

软件测试项目实战,电商项目测试实例 - 业务测试(重点)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 支付功能怎么测试…

pytest自动化测试实战之执行参数

上一篇介绍了如何运行pytest代码&#xff0c;以及用例的一些执行规则&#xff0c;执行用例发现我们中间print输出的内容&#xff0c;结果没有给我们展示出来&#xff0c;那是因为pytest执行时&#xff0c;后面需要带上一些参数。 参数内容 我们可以在cmd中通过输入 pytest -h…

域名捡漏的好方法,希望能够帮到你:域霸扫描器 V0.44 绿色免费版,供大家学习研究参考

高速扫描域名的工具&#xff0c;一均程序每小时五万条。 扫描域名是否注册&#xff0c;注册商是谁&#xff0c;域名的注册日期与过期日期。 供大家学习研究参考&#xff01; 下载&#xff1a;https://download.csdn.net/download/weixin_43097956/88025564