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 {

    @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 进行集成测试,以确保你的应用程序能够正常工作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(EMQX)STM32L+BC20+MQTT协议传输温湿度,ADC,电压,GPS数据到EMQX

1、材料准备 准备以下材料 2、设备连接 2.1 插入物联网卡&#xff0c;天线 首先把BC20核心板从开发板上拆下来 然后将物联卡放置在BC20核心板内 物联卡放置完成将BC20核心板重新插入到开发板内&#xff08;注意不要弄错方向&#xff09; 同时接入天线 2.2 连接ST-Link仿真…

RabbitMQ系列(27)--RabbitMQ使用Federation Exchange(联邦交换机)解决异地访问延迟问题

前言&#xff1a; (broker北京)、(broker深圳)彼此之间相距甚远&#xff0c;网络延迟是一个不得不面对的问题。有一个在北京的业务(Client北京&#xff09;需要连接(broker北京),向其中的交换器exchangeA发送消息&#xff0c;此时的网络延迟很小,(Client北京)可以迅速将消息发…

嵌入式QT- QT使用MQTT

目录 一、MQTT介绍 二、MQTT概念 2.1 订阅(Subscribtion) 2.2 会话&#xff08;Session&#xff09; 2.3 主题名&#xff08;Topic Name&#xff09; 2.4 主题筛选器&#xff08;Topic Filter&#xff09; 2.5 消息订阅 三、MQTT中的角色 3.1 客户端 3.2 服务器 四、X86平…

每个前端开发者都应知道的10个实用网站

1.Documatic Documatic 地址&#xff1a;www.documatic.com/ Documatic 是一个高效的搜索引擎工具&#xff0c;旨在帮助开发人员轻松搜索他们的代码库&#xff0c;找到特定的代码片段、函数、方法和其他相关信息。该工具旨在通过在几秒钟内快速提供准确和相关的搜索结果&…

CSDN博客运营团队2023年H1总结

一、运营工作的指导思路 CSDN的核心价值之一是帮助开发者/技术人快速的学习成长和解决技术问题。这个核心价值的建立离不开无数开发者的无私贡献&#xff0c;而运营工作的核心就是要保证这个价值链不断放大&#xff1a;让内容贡献者体验更好&#xff0c;付出有回报&#xff0c…

Maya适合哪个工作站?

Autodesk Maya 提供多种功能&#xff0c;可以适应电影、游戏和建筑等不同行业的需求。定制的 Autodesk Maya 工作站可以帮助您提高行业领先的 3D 计算机动画、建模、模拟和渲染软件的工作效率和用户体验。 根据您的特定需求定制的快速、强大的工作站可以帮助您充分利用 Maya 工…

python脚本(Word转PDF格式小工具)

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QMessageBox from PyQt5.QtCore import Qt import sys import os from comtypes import client#文件转换脚本 class FileDropWidget(QWidget):def __init__(self):super().__init__()self.initUI()de…

【SQL应知应会】行列转换(二)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 行列转换 • Mysql版 前言一、MySQL行列转换1.数据…

LayUI入门,以及介绍

一.LayUI基本情况 1.LayUI介绍 Layui&#xff08;流行于 layui.com&#xff09;是一款轻量级的前端UI框架&#xff0c;专注于提供简洁、易用、灵活的界面组件和交互体验。它基于HTML5和CSS3技术&#xff0c;采用模块化开发的思想&#xff0c;提供了丰富的UI组件、常用的工具函数…

一套完全开源,支持多租户,界面配置单点的后端框架JVS

JVS的多租户体系统 在IT系统中&#xff0c;“租户”&#xff08;tenant&#xff09;通常用于指代一种多租户架构&#xff08;multi-tenancy&#xff09;&#xff0c;它是一种软件架构模式&#xff0c;允许多个用户或组织共享相同的应用程序或系统实例&#xff0c;但彼此之间的…

短视频抖音账号矩阵系统源码---功能架构示例1

一、短视频账号矩阵系统源码开发服务器集群化处理开发成本更低&#xff08;前提&#xff09; 什么是集群化处理视频内存内耗&#xff1f;集群化处理视频内存内耗是指通过建立集群系统&#xff0c;将视频处理任务分配给多个计算节点进行并行处理&#xff0c;以减少单个计算节点…

PHP 音乐欣赏网站mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP音乐欣赏网站 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/88041034https://download.…

目标检测+车道线识别+追踪+测距(代码+部署运行)

目标检测车道线识别追踪测距 本文主要讲述项目集成&#xff1a;从车道线识别、测距、到追踪&#xff0c;集各种流行模型于一体&#xff01; 不讲原理&#xff0c;直接上干货&#xff01; 把下文环境配置学会&#xff0c;受益终生&#xff01; 各大项目皆适用&#xff01; …

什么是CI/CD?让你的项目变得更加敏捷!

在今天这个快速变化的时代&#xff0c;开发者们需要与时俱进&#xff0c;不断提升自己的工作效率。在这篇文章里&#xff0c;将一起探讨如何使用CI/CD和Github Action让你的项目更加高效&#xff0c;快速响应市场变化。 一、什么是CI&#xff1f; CI&#xff08;持续集成&…

前端基础(三十六):读取本地音视频设备并进行播放

效果 navigator.mediaDevices.enumerateDevices 请求媒体输入和输出设备的列表&#xff0c;例如麦克风&#xff0c;摄像机&#xff0c;耳机设备等 navigator.mediaDevices.getUserMedia 会提示用户给予使用媒体输入的许可&#xff0c;媒体输入会产生一个MediaStream&#xff0c…

有关于我在用uniapp开发的问题

1、uniapp做微信小程序&#xff0c;内嵌H5进行支付 其本质是这样的&#xff0c;在微信小程序种&#xff0c;用web-view嵌入H5页面&#xff0c;然后通过web-view的url对H5进行传参&#xff0c;H5传参后可以做一些处理&#xff0c;然后再把参数传给小程序进行支付 //uniapp小程…

云开发校园微社区-二手交易兼职交友微信小程序

云开发校园微社区微信小程序开源源码&#xff0c;这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码&#xff0c;可以给你提供快捷方便的校园生活&#xff0c;有很多有趣实用的板块和功能&#xff0c;如&#xff1a;闲置交易、表白交友、疑问互答、任务兼职…

使用腾讯云轻量应用服务器搭建网站教程

腾讯云轻量应用服务器怎么搭建网站&#xff1f;太简单了&#xff0c;轻量服务器选择宝塔Linux镜像&#xff0c;然后在宝塔面板上添加站点&#xff0c;以WordPress建站为例&#xff0c;腾讯云服务器网来详细说下腾讯云轻量应用服务器搭建网站全流程&#xff0c;包括轻量服务器配…

【企业微信多选的星期数据生成如“周一、周三至周六“】

目标效果如下图 实现这个过程首先是要找到逻辑&#xff0c;这个看似简单的操作却属实让我想了很久。 首先要了解需求 根据拿到的数据得到生成符合要求的字符串。中间有连续的星期大于三天的&#xff0c;开始和结束星期中间要有"至"。 分析逻辑 一、判断开始日期和…

Linux常用命令——emacs命令

在线Linux命令查询工具 emacs 功能强大的全屏文本编辑器 补充说明 emacs命令是由GNU组织的创始人Richard Stallman开发的一个功能强大的全屏文本编辑器&#xff0c;它支持多种编程语言&#xff0c;具有很多优良的特性。有众多的系统管理员和软件开发者使用emacs。 语法 e…