Mockito 的 MockMvc:零基础教程

2023-11-02

Mockito 的 MockMvc:零基础教程

大家好!今天,我们将一起学习 Mockito 的 MockMvc。在这篇零基础教程中,我们将介绍 MockMvc
的概念、应用场景、快速上手方法、常用特性、注意事项以及原理概述。让我们以轻松幽默的语气,适当使用一些比喻,开始这趟有趣的学习之旅吧!

一、MockMvc 简介

MockMvc 是 Spring Test 模块的一部分,它允许我们对 Spring MVC 控制器进行单元测试,而无需启动完整的 Spring 应用上下文。使用
MockMvc,我们可以模拟 HTTP 请求和响应,验证控制器是否按预期处理请求。简而言之,MockMvc 就像是一个虚拟的 Spring
MVC,能够让我们快速测试控制器,就像在真实环境中一样。

二、应用场景

MockMvc 主要应用于以下场景:

  1. 对 Spring MVC 控制器进行单元测试,确保控制器按预期处理 HTTP 请求。
  2. 验证控制器返回的视图、模型数据以及 HTTP 状态代码等。
  3. 测试控制器中的异常处理逻辑。
  4. 通过模拟 HTTP 请求,快速定位控制器中的潜在问题。

三、快速上手

要开始使用 MockMvc,我们只需遵循以下步骤:

  1. 添加 Spring Test 和 Mockito 相关依赖。
  2. 在测试类中,使用 @WebMvcTest@ExtendWith(SpringExtension.class)@ContextConfiguration 注解进行配置。
  3. 注入 MockMvc 实例。
  4. 使用 mockMvc.perform() 方法模拟 HTTP 请求,并验证预期的响应。

下面是一个简单的示例:


import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;

@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = HomeController.class)
class HomeControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private MyService myService;

    @Test
    void testHome() throws Exception {
        Mockito.when(myService.getData()).thenReturn("Hello, world!");

        mockMvc.perform(get("/home"))
                .andExpect(status().isOk())
                .andExpect(view().name("home"));
    }
}

四、常用特性

1. 模拟 HTTP 请求

我们可以使用 mockMvc.perform() 方法模拟 HTTP 请求。例如,使用 get()post()put()delete() 等方法分别模拟
GET、POST、PUT 和 DELETE 请求。此外,我们还可以使用 param()header()content() 等方法设置请求参数、请求头和请求体。


mockMvc.perform(get("/path").param("key","value"))
        .andExpect(status().isOk());

mockMvc.perform(post("/path").header("header-key","header-value").content("request body"))
        .andExpect(status().isCreated());
2. 验证 HTTP 响应

在模拟请求之后,我们可以使用 andExpect() 方法验证预期的响应。例如,我们可以验证 HTTP 状态码、响应头、响应体和视图名称等。


mockMvc.perform(get("/path"))
        .andExpect(status().isOk())
        .andExpect(header().string("Content-Type","application/json"))
        .andExpect(content().json("{\"key\":\"value\"}"))
        .andExpect(view().name("view-name"));
3. 异常处理

我们可以使用 andExpect() 方法验证控制器中的异常处理逻辑。例如,我们可以验证当抛出某种类型的异常时,控制器是否返回预期的
HTTP 状态码和响应体。


mockMvc.perform(get("/path/with/exception"))
        .andExpect(status().isInternalServerError())
        .andExpect(content().string("An error occurred"));
4. 集成 Mockito

要测试控制器与其他组件(如服务层)之间的交互,我们可以使用 Mockito 框架。例如,我们可以使用 @MockBean 注解创建 mock
对象,并使用 when() 方法定义预期的行为。


      @MockBean
      private MyService myService;
      
      @Test
      void testHome()throws Exception{
        Mockito.when(myService.getData()).thenReturn("Hello, world!");

        mockMvc.perform(get("/home"))
        .andExpect(status().isOk())
        .andExpect(view().name("home"));
        }

五、注意事项

  1. 使用 MockMvc 时,请确保注入正确的 MockMvc 实例。例如,如果使用 @WebMvcTest 注解,应使用 @Autowired
    注解自动注入 MockMvc 实例。
  2. 当模拟 HTTP 请求时,请确保提供正确的请求参数、请求头和请求体。否则,可能导致测试失败。
  3. 使用 Mockito 时,请确保正确配置 mock 对象的预期行为。否则,可能导致测试失败或不准确的测试结果。
  4. 避免在单元测试中过度使用集成测试功能。尽量将关注点集中在控制器层,以保持测试的简洁性和高效性。

六、原理概述

MockMvc 基于 Spring Test 模块,通过创建虚拟的 Spring MVC 环境,模拟 HTTP 请求和响应。在运行测试时,MockMvc
会调用相应的控制器方法,并捕获生成的 HTTP 响应。然后,我们可以使用各种断言方法验证控制器是否按预期处理请求和生成响应。

MockMvc 使用 DispatcherServlet 进行请求分派,并使用 HandlerAdapter 调用控制器方法。在模拟的 Spring MVC
环境中,所有的请求处理组件(如拦截器、过滤器和异常处理器)都可以正常工作,就像在真实的
Spring MVC 环境中一样。这使得我们可以方便地测试控制器在处理请求时的行为和逻辑。

在集成 Mockito 时,我们可以使用 @MockBean 注解创建 mock 对象,并使用 when()
方法定义预期的行为。这样,在测试控制器与其他组件(如服务层)之间的交互时,我们可以方便地验证控制器是否正确调用这些组件,并验证返回的数据是否按预期处理。

通过使用 MockMvc 和 Mockito,我们可以快速、简便地对 Spring MVC 控制器进行单元测试,而无需启动完整的 Spring
应用上下文。这有助于降低测试的复杂性,提高测试的执行速度,并确保我们的应用程序在不同场景下都能正常工作。

七、总结

在这篇 Mockito 的 MockMvc 零基础教程中,我们介绍了 MockMvc 的概念、应用场景、快速上手方法、常用特性、注意事项以及原理概述。通过使用
MockMvc 和 Mockito,我们可以轻松地对 Spring MVC 控制器进行单元测试,确保控制器按预期处理 HTTP 请求。

希望这篇教程能帮助你快速掌握 Mockito 的 MockMvc,并将其应用于你的项目中。现在,让我们以轻松幽默的语气,继续探索 Spring MVC 和
Mockito 的更多功能吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mockito 的 MockMvc:零基础教程 的相关文章

随机推荐

  • linux下使用selenium

    1 需要linux安装chrome浏览器 安装命令 yum localinstall google chrome stable current x86 64 rpm 2 得的谷歌浏览器版本号 根据版本号选择最接近的内核版本 linux命令
  • 反射获取类的成员变量值

    public class ClassFieldTest public ClassFieldTest List
  • machine unlearning 论文阅读笔记

    文章目录 前言 概要 导论 unlearning 定义 SISA 系统 时间复杂度 实验测试 总结 前言 做一篇发表在顶会S P 4 2 n d 42 nd
  • Connection reset by peer

    今天升级完openssh8 6以后突然发现无法连接服务器了 注意前提是升级成功了 连接时报错如下 Connection reset by peer 解决方案 使用root执行命令 echo sshd ALL gt gt etc hosts
  • 【mcuclub】水流量检测模块-YF-S401

    一 实物图 型号 YF S401 二 原理图 编号 名称 功能 1 VCC 电源正 红色线 2 GND 电源地 黑色线 3 OUT 输出引脚 黄色线 三 简介 水流量传感器主要由塑料阀体 水流转子组件和霍尔传感器组成 它装在电器的进水端 用
  • JVM--调优--03--开发配置

    JVM 调优 03 开发配置 1 本地配置 Xmx1g Xms1g Xmn900m XX UseG1GC Xloggc gc log XX PrintGCDetails 2 linux tomcat 配置 进入tomcat的bin目录 修改
  • 软工作业 双人项目代码规范

    双人项目代码编写规范 蔡东杰 房林尧 以下共分为四个部分 缩进代码 命名规则 代码注释 异常处理 部分规范已做实例说明 后续编代码时需要严格遵守 一 关于缩进代码 一行里面只写一行代码 包括定义变量 一行只定义一个 左括号和后一个字符之间不
  • Java分支和循环语句及方法的使用

    1 分支语句No3 顺序语句 分支语句 循环语句 1 1 分支语句 选择结构 分支语句满足某种条件则执行某一部分 满足另一种条件则执行另一部分 1 2 if语句 简单分支语句 if boolean类型表达式 语句 如果小括号中的表达式成立
  • STM32中断知识点简介

    中断服务函数存放路径为启动文件 startup stm32f10x hd 1 常用的中断服务函数 外部中断服务函数 EXTI0 IRQHandler EXTI0 IRQn EXTI1 IRQHandler EXTI1 IRQn EXTI2
  • jenkins默认会存放目录

    jenkins默认会存放在用户主目录下的 jenkins文件夹中 如 Linux root用户 root jenkins 注意 这是linux版本的 windows系统请自行更改 这个值在Jenkins运行时是不能更改的 请先将Jenkin
  • 自定义coco数据集

    1 环境 anaconda环境安装配置 2 工具 安装labelme工具 3 安装软件 3 1 打开anaconda控制台 3 2 创建虚拟环境 conda create n labelme python 3 7 3 3 激活环境 cond
  • 函数调用栈

    函数调用栈 我们在编程中写的函数 会被编译器编译为机器指令 写入可执行文件 程序执行的时候 会把这个可执行文件加载到内存 在虚拟地址空间中的代码段存放 如果在一个函数中调用另一个函数 编译器就会对应生成一条call指令 当程序执行到这条ca
  • 不使用mybatis的@Param有的报错有的却不报错问题

    前几天更换电脑重新安装新的idea发现在dao层 有的同事没有使用 Param注解 导致系统报错 错误如下 org mybatis spring MyBatisSystemException nested exception is org
  • 显示实例化和显示具体化

    struct man int age double salary 显示具体化 指定模板函数中类型 意思是不要使用swap模板来生成函数定义 而是要使用专门为job类型显示定义的函数定义 因为job是一个结构体 所以swap不可能是直接的利用
  • Flutter的Stepper

    文章目录 Flutter的Stepper的简介 Stepper的详细介绍 使用方法 导入flutter material dart包 创建状态变量 创建Stepper 创建一个Step widget列表 典型用法 Step对象的创建 例子
  • 2023 1.2 Scala变量与数据类型

    学习目标 学会变量声明 掌握数据类型 初学Scala时 建议读者在Scala命令行模式中操作 最终程序的编写可以在IDE中进行 在Windows的CMD窗口中或CentOS的Shell命令中执行scala命令 即可进入Scala的命令行操作
  • uni-app列表组件 list组件,简单好用通用

    随着技术的发展 开发的复杂度也越来越高 传统开发方式将一个系统做成了整块应用 经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改 造成牵一发而动全身 通过组件化开发 可以有效实现单独开发 单独维护 而且他们之间可以
  • Dockerfile 中 配置安装 php 扩展

    我的个人博客 逐步前行STEP 以下配置实现了 在docker环境中安装scwl中文分词的php扩展 scwl RUN curl http www xunsearch com scws down scws 1 2 3 tar bz2 o s
  • 管理回收站+启用/禁用回收站+查看回收站信息+清空回收站对象

    管理回收站 1启用 禁用回收站 1 关闭回收站 alter session set recyclebin off show parameter recyclebin 2 启用回收站 alter session set recyclebin
  • Mockito 的 MockMvc:零基础教程

    Mockito 的 MockMvc 零基础教程 大家好 今天 我们将一起学习 Mockito 的 MockMvc 在这篇零基础教程中 我们将介绍 MockMvc 的概念 应用场景 快速上手方法 常用特性 注意事项以及原理概述 让我们以轻松幽