利用@WebMvcTest测试Spring MVC应用

文章目录
  • 1. @WebMvcTest概述
  • 2. 创建Spring Boot项目
  • 3. 创建主页控制器类
  • 4. 准备图片素材
  • 5. 创建主页模板视图
  • 6. 主页控制器测试类
    • 6.1 创建主页控制器测试类
    • 6.2 运行单元测试方法
  • 7. 启动应用,查看结果
    • 7.1 启动应用
    • 7.2 访问项目首页
  • 8. 实战小结

1. @WebMvcTest概述

  • 在 Spring MVC 应用的测试领域,@WebMvcTest 注解发挥着极为关键的作用。它为测试提供了专门定制的 Spring 环境支持,使得开发者能够在无需完整启动应用服务器的情况下,对 Spring MVC 的核心功能进行精准测试。

  • 传统的测试方式可能需要启动整个服务器来验证功能,这种做法在某些场景下显得笨重且效率低下。而 @WebMvcTest 则不同,它专注于 Spring MVC 相关的组件,例如控制器(Controller)等。通过注入 MockMvc 实例,测试类能够轻松地模拟 Spring MVC 的运行机制。

  • MockMvc 为测试带来了极大的便利性。它允许开发者编写测试用例来模拟 HTTP 请求的发送与接收,就如同在真实的浏览器与服务器交互环境中一样。例如,可以轻松地模拟 GET、POST 等各种 HTTP 方法的请求,并且对控制器返回的结果进行断言验证。这意味着能够快速地检查控制器中的业务逻辑是否正确,比如验证数据是否被正确处理、视图是否正确返回等。

  • 在实际应用场景中,假设我们正在开发一个电商系统的商品控制器。使用 @WebMvcTest 注解的测试类可以注入 MockMvc,并针对商品的查询、添加、修改等操作编写详细的测试用例。如模拟一个查询商品列表的 GET 请求,然后验证返回的商品数据是否符合预期,包括商品的名称、价格、库存等信息是否准确无误。如果没有 @WebMvcTest 提供的这种简洁高效的测试机制,开发者可能需要花费大量精力启动整个电商应用服务器,进行复杂的端到端测试,这不仅耗时,而且在开发初期可能由于其他模块尚未完善而难以开展。

  • 综上所述,@WebMvcTest 注解在 Spring MVC 应用测试中具有不可替代的地位。它通过巧妙地注入 MockMvc,以轻量级的方式模拟 Spring MVC 运行机制,极大地提高了测试效率,让开发者能够更加专注于控制器层逻辑的正确性验证,从而加速整个 Spring MVC 应用的开发与完善进程。

2. 创建Spring Boot项目

  • 设置项目基本信息
    在这里插入图片描述
  • 选择Spring Boot版本,添加项目依赖
    在这里插入图片描述
  • 单击【Create】按钮,生成项目基本骨架
    在这里插入图片描述

3. 创建主页控制器类

  • net.huawei.tacocloud包里创建controller子包
    在这里插入图片描述

  • controller子包里创建HomeController
    在这里插入图片描述

    package net.huawei.tacocloud.controller;

    /**

    • 功能:主页控制器
    • 作者:华卫
    • 日期:2024年12月02日
      */

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;

    @Controller // 控制器注解
    public class HomeController {
    @GetMapping(“/”) // 处理对根路径“/ ”的请求
    public String home() {
    return “home”; // 返回逻辑视图名
    }
    }

  • 可以看到,这个类带有@Controller注解。就其本身而言,@Controller并没有做太多的事情。它的主要目的是让组件扫描将这个类识别为一个组件。因为HomeController带有@Controller注解,所以Spring的组件扫描功能会自动发现它,并创建一个HomeController实例作为Spring应用上下文中的bean。

  • 实际上,有一些其他的注解与@Controller有着类似的目的(包括@Component@Service@Repository)。你可以为HomeController添加上述的任意其他注解,其作用是完全相同的。但是,在这里选择使用@Controller更能描述这个组件在应用中的角色。

  • home()是一个简单的控制器方法。它带有@GetMapping注解,表明如果针对“/”发送HTTP GET请求,那么将会由这个方法来处理请求。该方法所做的只是返回String类型的home值。

  • 这个值将会解析为视图的逻辑名。视图如何实现取决于多个因素,但是Thymeleaf位于类路径中,使得我们可以使用Thymeleaf来定义模板。

4. 准备图片素材

  • static里创建images目录
    在这里插入图片描述
  • 将图片TacoCloud.png拷贝到images目录
    在这里插入图片描述

5. 创建主页模板视图

  • templates里创建home.html文件
    在这里插入图片描述

    Taco Cloud Home

    Welcome to Taco Cloud

  • 这个模板并没有太多需要讨论的。唯一需要注意的是用于展现Taco Cloud Logo的<img>标签。它使用了Thymeleaf的th:src属性和@{...}表达式,以便于引用相对于上下文路径的图片。除此之外,这个主页就是一个扮演“Hello World”角色的页面。

6. 主页控制器测试类

6.1 创建主页控制器测试类

  • testjavanet.huawei.tacocloud包里创建HomeControllerTest
    在这里插入图片描述

    package net.huawei.tacocloud;

    import net.huawei.tacocloud.controller.HomeController;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
    import org.springframework.test.web.servlet.MockMvc;

    import static org.hamcrest.Matchers.containsString;
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

    /**

    • 功能:主页控制器测试类

    • 作者:华卫

    • 日期:2024年12月02日
      */
      @WebMvcTest(HomeController.class) //针对HomeController的Web测试
      public class HomeControllerTest {

      @Autowired
      private MockMvc mockMvc; // 注入MockMvc

      @Test
      public void testHomePage() throws Exception {
      mockMvc.perform(get(“/”)) // 发起对“/”的GET请求
      .andExpect(status().isOk()) // 期望得到HTTP 200
      .andExpect(view().name(“home”)) // 期望得到home视图
      .andExpect(content().string(containsString(“Welcome to Taco Cloud”))); // 期望包含“Welcome to Taco Cloud”
      }
      }

  • 对于这个测试,首先注意到的可能就是它使用了与TacoCloudApplicationTests类不同的注解。HomeControllerTest没有使用@SpringBootTest标记,而是添加了@WebMvcTest注解。这是Spring Boot提供的一个特殊测试注解,让这个测试在Spring MVC应用的上下文中执行。更具体来讲,在本例中,它会将HomeController注册到Spring MVC中,这样一来,我们就可以向它发送请求了。

  • @WebMvcTest同样会为测试Spring MVC应用提供了Spring环境的支持。尽管可以启动一个服务器来进行测试,但是对于我们的场景来说,仿造一下Spring MVC的运行机制就可以。测试类被注入了一个MockMvc,能够让测试实现mockup。

  • 通过testHomePage()方法,我们定义了针对主页想要执行的测试。它首先使用MockMvc对象对“/”(根路径)发起HTTP GET请求。对于这个请求,我们设置了如下的预期:

    • 响应应该具备HTTP 200 (OK)状态
    • 视图的逻辑名称应该是home
    • 渲染后的视图应该包含文本Welcome to Taco Cloud

6.2 运行单元测试方法

  • 运行testHomePage()测试方法,查看结果
    在这里插入图片描述

  • 如果在MockMvc对象发送请求之后,上述预期没有全部满足,那么这个测试会失败。但是,我们的控制器和视图模板在编写时都满足了这些预期,所以测试应该能够通过,并且带有成功的图标——至少能够看到一些绿色的背景,表明测试通过了。

  • 解决Mockito警告:Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build what is described in Mockito’s documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#0.3

  • Mockito 目前使用 Java Agent 来启用其内联模拟制造器。在未来的 JDK 版本中,这种动态附加可能不再工作。为了解决这个问题,你需要按照 Mockito 的文档配置 Mockito 作为构建过程中的 Agent。根据 Mockito 的文档,在Maven构建配置中添加插件。
    在这里插入图片描述

    org.apache.maven.plugins maven-surefire-plugin 3.5.2 -javaagent:"${settings.localRepository}/org/mockito/mockito-core/5.14.2/mockito-core-5.14.2.jar"
  • 再次运行testHomePage()测试方法,查看结果
    在这里插入图片描述

7. 启动应用,查看结果

7.1 启动应用

  • 运行引导类TacoCloudApplication
    在这里插入图片描述

7.2 访问项目首页

  • 访问http://localhost:8080
    在这里插入图片描述

8. 实战小结

  • 在本次实战中,我们深入探讨了Spring Boot项目中@WebMvcTest注解的应用,它允许开发者在不启动整个服务器的情况下,高效测试Spring MVC组件。通过逐步指导,我们创建了Spring Boot项目,编写了主页控制器和测试类,并通过MockMvc进行了单元测试。此外,解决了Mockito的Java Agent警告,确保了测试的顺利进行。最终,我们成功启动应用并验证了测试结果,展示了@WebMvcTest在提升测试效率和专注业务逻辑验证方面的重要性。

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

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

相关文章

Java8面试

Java 8 有哪些新特性? &#x1f40e;Java 8五大神装特性&#x1f40e; Lambda表达式&#xff08;魔法调料&#xff09; 曼波觉得像速食魔法咒语&#xff01;(๑✧◡✧๑) // 传统写法&#xff08;像冗长菜谱&#xff09; new Thread(new Runnable() {public void run() {Syst…

【前端基础】Day 7 CSS高级技巧

目录 1. 精灵图 1.1 为什么需要精灵图 1.2 精灵图&#xff08;sprites&#xff09;的使用 2. 字体图标 2.1 字体图标的产生 2.2 字体图标的优点 2.3 字体图标的下载 2.4 字体图标的引入 2.5 字体图标的追加 3. CSS三角形 4. CSS用户界面样式 4.1 更改用户鼠标样式 …

初步理解RNN和LSTM

RNN RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种能够处理序列数据的神经网络。这里的时序信息可以指例如对于这一句话 “我吃了一个苹果”&#xff0c;“苹果” 的词性和意思&#xff0c;在这里取决于前面词的信息&#xff0c;如果没…

【华为OD机考】华为OD笔试真题解析(18)--找出通过车辆最多的颜色

题目描述 在一个狭小的入口&#xff0c;每秒只能通过一辆车&#xff0c;假如车辆的颜色只有3种&#xff0c;找出N秒内经过的最多颜色的车辆数量&#xff0c;三种颜色编号为0、1、2。 输入描述 第一行输入的是通过的车辆颜色信息&#xff0c;[0,1,1,2]代表4秒钟通过的车辆颜色…

基于POI的Excel下拉框自动搜索,包括数据验证的单列删除

目录 目标 例子 1.搜索下拉框页 2.数据源页 3.效果 代码以及注意事项 1.代码 2.注意事项 1.基于Excel的话&#xff0c;相当于加入了一个【数据验证】 2.代码中的一些方法说明 目标 期望在Excel利用代码创建具备自动搜索功能的下拉框 例子 1.搜索下拉框页 2.数据源…

【最后203篇系列】010 关于矩阵的一点思考

说明 今天拿起一本矩阵的书又翻了翻&#xff0c;毕竟AI搞到最后还得是数学。 我是感觉自己高数始终有点学的迷迷糊糊的&#xff0c;就打算这一年慢慢把矩阵部分扫一遍&#xff0c;毕竟这快肯定是实打实有用的。其他高级部分就等我发财之后再说了&#xff0c;哈哈。 内容 今…

(动态规划 最长递增的子序列)leetcode 300

这道题我第一眼反应就是暴力&#xff0c;但是暴力的话就是n*n-1*n-2*...n-(n-1) 也就是O(n^n)dfs做绝对超时 贪心也不行&#xff0c;这里是子序列&#xff0c;要考虑在ni的范围内考虑多种路线取最优&#xff0c;所以用动态规划 如何用动态规划呢&#xff1f; 答&#xff1a;…

本地大模型编程实战(26)用langgraph实现基于SQL数据构建的问答系统(5)

本文将将扩展上一篇文章完成的 langgraph 链&#xff0c;继续使用基于 langgraph 链 &#xff0c;对结构化数据库 SQlite 进行查询的方法。该系统建立以后&#xff0c;我们不需要掌握专业的 SQL 技能&#xff0c;可以用自然语言询问有关数据库中数据的问题并返回答案。主要完善…

Linux---共享内存

1.ipcs命令 IPC机制是一个让人烦恼的问题&#xff1a;编写错误的程序或因为某些原因而执行失败的程序将把它的IPC资源&#xff08;如消息队列中的数据&#xff09;遗留在系统里&#xff0c;并且这些资源在程序结束后很长时间让然在系统中游荡&#xff0c;这导致对程序的新调用…

RAG 阿里云

RAG-阿里云Spring AI Alibaba官网官网 RAG-阿里云Spring AI Alibaba官网官网 AI应用跑起来&#xff0c;取消一下航班的操作666

M4 Mac mini运行DeepSeek-R1模型

前言 最近DeepSeek大模型很火&#xff0c;实际工作中也有使用&#xff0c;很多人觉得需要很好的显卡才能跑起来&#xff0c;至少显存需要很高&#xff0c;但实际上一般的核显机器也能跑起来&#xff0c;只不过内存要求要大&#xff0c;对于个人而言&#xff0c;实际上Mac M芯片…

【Cadence射频仿真学习笔记】2.4GHz低噪放LNA仿真设计

课程分为3个部分&#xff0c; 一、LNA结构与噪声优化方法 噪声优化的方法是&#xff1a;限定功耗的噪声和功率同时匹配噪声匹配和功率匹配一般不会同时达到&#xff0c; 对于PCSNIM结构的噪声分析&#xff0c;我们只需要了解与哪些参数有关优化思路是&#xff1a;1.信号源阻抗…

机器学习:线性回归,梯度下降,多元线性回归

线性回归模型 (Linear Regression Model) 梯度下降算法 (Gradient Descent Algorithm) 的数学公式 多元线性回归&#xff08;Multiple Linear Regression&#xff09;

C++22——哈希

目录 1.unordered_map的文档介绍 2.unordered_set的文档介绍 3.底层结构 3.1哈希的概念 3.2哈希冲突 3.3哈希函数 3.4哈希冲突解决 3.4.1闭散列 3.4.2开散列 1.unordered_map的文档介绍 unordered_map在线文档说明 unordered_map是存储<key&#xff0c;value>键值…

Docker 搭建 Gitlab 服务器 (完整详细版)

参考 Docker 搭建 Gitlab 服务器 (完整详细版)_docker gitlab-CSDN博客 Docker 安装 (完整详细版)_docker安装-CSDN博客 Docker 日常命令大全(完整详细版)_docker命令-CSDN博客 1、Gitlab镜像 # 查找Gitlab镜像 docker search gitlab # 拉取Gitlab镜像 docker pull gitlab/g…

如何杀死僵尸进程?没有那个进程?

在题主跑代码的时候遇到了这样一种很奇怪的问题&#xff1a; 可以看到显卡0没有跑任何程序但是还是被占据着大量显存&#xff0c;这种进程称为“僵尸进程”&#xff0c;并且当我想kill它的时候&#xff0c;出现下面这种情况&#xff1a; 查过各种资料&#xff0c;最后我的解决…

从0开始的IMX6ULL学习篇——裸机篇之分析粗略IMX6ULL与架构

目录 简单的说一下Cortex-A7架构 讨论ARMv7a-cortex系列的运行模式 寄存器 后言 让我们到NXP的官网上扫一眼。 i.MX 6ULL应用处理器_Arm Cortex-A7单核&#xff0c;频率为900 MHz | NXP 半导体 我们先看CPU Platform&#xff0c;这个是我们的核心。 这里我们的芯片是基于Ar…

从UNIX到Linux:操作系统进化史与开源革命

从UNIX到Linux&#xff1a;操作系统进化史与开源革命 一、操作系统&#xff1a;数字世界的基石 1.1 什么是操作系统&#xff1f; 操作系统&#xff08;OS&#xff09;是计算机系统的核心管理者&#xff0c;承担着三大核心使命&#xff1a; 硬件指挥官&#xff1a;直接管理C…

风控算法技术图谱和学习路径

风控算法技术图谱和学习路径可以从以下几个方面进行详细阐述: 一、风控算法技术图谱 基础知识与理论框架 风控算法技术的核心在于数据处理、特征工程、模型构建及优化。基础知识包括统计学、机器学习、深度学习、图算法等。例如,基于Python的智能风控书籍详细介绍了信贷风控…

Word 插入图片会到文字底下解决方案

一、现象描述 正常情况下&#xff0c;我们插入图片都是这样的。 但有时突然会这样&#xff0c;插入的图片陷于文字底部。 二、网上解决方案 网上有教程说&#xff0c;修改图片布局选项&#xff0c;从嵌入型改成上下型环绕。改完之后确实有用&#xff0c;但是需要手动拖动图片…