【第九篇】 SpringBoot测试补充篇
简介
本文介绍了SpringBoot测试中的五项关键技术:测试类专用属性加载、 测试类专用Bean配置、 表现层测试方法、测试类事务回滚控制、配置文件随机数据设置)。这些技术可以有效隔离测试环境,确保测试数据不影响生产环境,同时提供了便捷的测试验证手段。文章内容若存在错误或需改进的地方,欢迎大家指正!若对操作有任何疑问欢迎留言!非常感谢!
目录
一、加载测试类专用属性
1、使用@SpringBootTest的properties属性
2、使用@SpringBootTest的args属性
二、测试类专用Bean
1、创建配置类
2、在需要引用的类上面声明引入配置类
三、测试表现层
1、测试类中启动web环境
2、发送虚拟请求
(1)开启发送虚拟请求的功能
(2)发送虚拟请求
(3)测试
3、匹配响应
(1)匹配响应结果
(2)匹配响应体
(3)匹配响应头
四、测试类的事务回滚
1、事务回滚实现
五、配置文件设置随机数据
1、设置随机数据
2、测试
一、加载测试类专用属性
如果只想在当前测试类中加载专用属性,而不影响其他任何代码,那么就可以使用下面的方式。
1、使用@SpringBootTest的properties属性
第一种方式是可以使用@SpringBootTest注解的properties属性进行配置当前测试类的临时属性,仅在当前类生效,参数是一个数组。
可以看到下面连resources目录都没有,但是临时配置可以生效。若resources目录下的application配置文件存在,那么当前测试类会先加载配置文件,然后再加载这个类的临时属性,相同的属性会被临时属性覆盖,不同的属性全都保留。
2、使用@SpringBootTest的args属性
第二种方式是可以使用@SpringBootTest注解的args属性进行配置当前测试类的临时属性,仅在当前类生效,参数是一个数组。
args属性的级别比properties级别高,也就是说属性同时存在时,args属性会覆盖相同属性。
二、测试类专用Bean
如果在测试的时候需要引入一下外部的Bean,仅仅在当前测试类中使用,而不在全局生效,那么就可以使用下面的方式。
1、创建配置类
这里使用Student类做为第三方Bean使用
首先是先在test目录下创建一个配置类,注意这个类并没有任何注解进行声明,就是一个普通的类,然后写一个方法,方法的返回值就是第三方类,并使用@Bean注解进行声明。由于当前类是一个普通类,就算方法上面声明了@Bean注解,也不会主动成为IOC容器中的Bean。
2、在需要引用的类上面声明引入配置类
在需要使用Bean的测试类上面使用@Import注解引入配置类,然后在测试类里面就能正常使用第三方Bean了。这是因为使用@Import注解,只有当运行了当前测试类的时候,会自动将配置类注册为IOC容器中的Bean,当配置类成为IOC容器中的Bean之后,就会将被@Bean声明的方法的返回值也注册为Bean,于是在当前类中就可以使用第三方Bean了。
三、测试表现层
1、测试类中启动web环境
测试类中默认是步启动web环境的,需要进行一些配置让测试类也能启动web环境。只需要给@SpringBootTest注解的webEnvironment属性赋值即可,webEnvironment属性值默认是SpringBootTest.WebEnvironment.NONE,代表不启动web环境,那么只需要设置为DEFINED_PORT或者RANDOM_PORT即可。
- DEFINED_PORT:表示使用默认的端口启动web环境,也就是程序设置的端口是多少就使用多少。
- RANDOM_PORT:表示使用随机的端口启动web环境,这里不会出现端口冲突。
2、发送虚拟请求
(1)开启发送虚拟请求的功能
在当前测试类上声明@AutoConfigureMockMvc注解,该注解作用是开启发送虚拟请求的功能。
(2)发送虚拟请求
开启启动web环境和发送虚拟请求的功能之后,只需要在当前测试类中注入MockMvc对象,然后使用MockMvc对象调用perform方法即可发送虚拟请求。perform方法接收一个RequestBuilder类型的对象,RequestBuilder是一个接口,MockHttpServletRequestBuilder是它的实现类,所以需要创建一个MockHttpServletRequestBuilder对象传递给perform方法。MockHttpServletRequestBuilder对象的创建是通过抽象类MockMvcRequestBuilders调用方法创建,抽象类MockMvcRequestBuilders可以调用get、post、put、delete等方法,方法入参是URL,也就是请求路径,这些方法也就代表了MockHttpServletRequestBuilder对象要发送什么请求,然后由perform方法发送。
(3)测试
可以看到成功向getById方法发送Get请求。
3、匹配响应
通过上面的设置就已经可以发送请求了,那么下面的操作就是匹配调用之后的结果了。当通过perform方法发送请求之后,会返回一个ResultActions对象,然后可以拿到这个对象调用andExpect方法进行匹配预期值,方法的入参是预期值,实际值已经在ResultActions对象中了,andExpect方法自带断言,若实际值与入参的预期值相同,那么就什么也不会发生,反之则会报错,并打印匹配的信息。
预期值对象由抽象类MockMvcResultMatchers调用指定的方法得到,然后再由预期值对象设置预期值,然后作为参数传递给andExpect方法即可。MockMvcResultMatchers可以调用指定的方法获取请求信息和响应信息,下面举三个例子,其余校验只需要改变MockMvcResultMatchers调用的方法即可。
因为成功之后不会有任何提示,所以下面的测试,会使用失败用例。
(1)匹配响应结果
使用MockMvcResultMatchers调用status方法即可得到调用结果响应状态对象,然后使用该对象设置预期值,最后将调用结果响应状态对象传递给andExpect方法即可。
(2)匹配响应体
使用MockMvcResultMatchers调用content方法即可得到响应体对象,然后使用该对象设置预期值,最后将响应体对象传递给andExpect方法即可。
(3)匹配响应头
使用MockMvcResultMatchers调用header方法即可得到请求头对象,然后使用该对象设置预期值,最后将请求头对象传递给andExpect方法即可。
四、测试类的事务回滚
在测试类中会有操作数据库的方法,类似于下面的操作,当每次运行测试类的时候,就会全量的执行这些方法,在执行这些方法的时候,会直接影响数据库的数据,因为测试数据是严禁影响真实数据的,那么所有测试类的测试方法中有关操作数据库的操作应该全部由事务管理并最终将事务全部回滚,保证不对真实数据造成任何影响。
1、事务回滚实现
只需要在测试类上增加@Transactional和@Rollback(value = true)注解即可,并且@Rollback注解的属性value的值为true,就代表该测试类中所有有关数据库的操作全部回滚,如果需要提交事务,那么只需要将value的值设置为false即可。因为@Rollback注解的属性value的值默认就为true,所以如果只想设置事务全部回滚,那么只在测试类上加@Transactional一个注解也可以。
五、配置文件设置随机数据
在配置文件中设置随机数据,不是专门为测试提供的功能,而是在测试的场景中使用的比较多,当然在其他地方使用也完全没有问题。
1、设置随机数据
只需要在配置文件中使用${random.类型},即可获取随机值,具体类型如下。另外字符串类型的还可以自定义拼接字符串,整形和长整型的范围表示也不一定非得使用小括号。
2、测试
使用正常属性绑定,然后获取实体类的Bean,然后直接打印即可看到效果。
上一篇——》【第八篇】 SpringBoot高级配置(配置篇)https://blog.csdn.net/qq1743177790/article/details/148513782
相关文章:

【第九篇】 SpringBoot测试补充篇
简介 本文介绍了SpringBoot测试中的五项关键技术:测试类专用属性加载、 测试类专用Bean配置、 表现层测试方法、测试类事务回滚控制、配置文件随机数据设置)。这些技术可以有效隔离测试环境,确保测试数据不影响生产环境,同时提供了…...

springcloud SpringAmqp消息队列 简单使用
这期只是针对springBoot/Cloud 在使用SpringAmqp消息队列的时候遇到的坑。 前提 如果没有安装RabbitMQ是无法连接成功的!所以前提是你要安装好RabbitMQ。 docker 安装命令 # 拉取docker镜像 docker pull rabbitmq:management# 创建容器 docker run -id --namera…...

Framework开发之IMS逻辑浅析1--关键线程及作用
关键线程:EventHub,InputReader,InputDispatcher EventHub: 由于Android继承Linux,Linux的思想是一切皆文件,而输入的类型不止一种(触碰,写字笔,键盘等),每种类型都对应一种驱动设备,而每个硬件驱动设备又对应Linux的一个目录文件…...
The Quantization Model of Neural Scaling
文章目录 摘要1引言2 理论3 概念验证:一个玩具数据集3.1 “多任务稀疏奇偶校验”数据集3.2 幂律规模和新兴能力 4 拆解大型语言模型的规模定律4.1 单token损失的分布4.2 单基因(monogenic)与多基因(polygenic)的规模曲…...
数据源指的是哪里的数据,磁盘中还是内存中
在 MyDB 项目中,特别是这段缓存框架代码: T obj getForCache(key);以及它的上下文: AbstractCache 是一个抽象类,内部有两个抽象方法,留给实现类去实现具体的操作: protected abstract T getForCache(lon…...

系统思考:跳出症状看全局
明天将为华为全球采购认证管理部的伙伴们带来一场关于系统思考的深度课程!通过经典的啤酒游戏经营决策沙盘,一起沉浸式体验如何从全局视角看待问题,发现单点最优并不等于全局最优。 这不仅是一次简单的课程,更是一次洞察系统背后…...

DeepSeek R1 V2 深度探索:开源AI编码新利器,效能与创意并进
最近,AI界迎来了一位神秘的“突袭者”——DeepSeek团队悄无声息地发布了其推理模型DeepSeek R1的重磅升级版V2(具体型号R1-0528)。这款基于MIT许可的开源模型,在原版R1的基础上进行了多项令人瞩目的改进,正以其强大的潜…...

surfer15安装
安装文件 安装包和破解文件 安装 破解及汉化 打开软件...
MySQL从入门到DBA深度学习指南
目录 引言 MySQL基础入门 数据库基础概念 MySQL安装与配置 SQL语言进阶 数据库设计与规范化 数据库设计原则 表结构设计 MySQL核心管理 用户权限管理 备份与恢复 性能优化基础 高级管理与高可用 高可用与集群 故障诊断与监控 安全与审计 DBA实战与运维 性能调…...

Python训练营---DAY48
DAY 48 随机函数与广播机制 知识点回顾: 随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,会自动计算的)pytorch的广播机制:加法和乘法的广播机制 ps:numpy运算也有类似的广播机…...

debian12拒绝海外ip连接
确保 nftables 已安装: Debian 12 默认使用 nftables 作为防火墙框架。检查是否安装: sudo apt update sudo apt install nftables启用并启动 nftables 服务 sudo systemctl enable nftables sudo systemctl start nftables下载maxmind数据库 将文件解…...

70年使用权的IntelliJ IDEA Ultimate安装教程
安装Java环境 下载Java Development Kit (JDK) 从Oracle官网或OpenJDK。推荐选择JDK 11或更高版本。 运行下载的安装程序,按照提示完成安装。注意记录JDK的安装路径(如C:\Program Files\Java\jdk-11.0.15)。 配置环境变量: 右键…...

MySQL的日志
就相当于人的日记本,记录每天发生的事,可以对数据进行追踪 一、错误日志 也就是存放错误信息的 二、二进制日志-binlog 在低版本的MySQL中,二进制日志是不会默认开启的 存放除了查询语句的其他语句 三、查询日志 查询日志会记录客户端的所…...

低功耗高安全:蓝牙模块在安防系统中的应用方案
随着物联网(IoT)和智能家居的快速发展,安防行业正迎来前所未有的技术革新。蓝牙模块作为一种低功耗、高稳定性的无线通信技术,凭借其低成本、易部署和智能化管理等优势,在安防领域发挥着越来越重要的作用。本文将探讨蓝牙模块在安防系统中的应…...
数据库(sqlite)基本操作
数据库(sqlite) 一:简介: 为什么需要单独的数据库来进行管理数据? 数据的各种查询功能数据的备份和恢复花大量时间在文件数据的结构设计和维护上要考虑多线程对数据的操作会涉及到同步问题,会增加很多额…...
【HarmonyOS 5】游戏开发教程
一、开发环境搭建 工具配置 安装DevEco Studio 5.1,启用CodeGenie AI助手(Settings → Tools → AI Assistant)配置游戏模板:选择"Game"类型项目,勾选手机/平板/折叠屏多设备支持 二、游戏引擎核心架构…...
神经元激活函数在神经网络里起着关键作用
神经元激活函数在神经网络里起着关键作用,它能为网络赋予非线性能力,让网络可以学习复杂的函数映射关系。下面从多个方面详细剖析激活函数的作用和意义: 1. 核心作用:引入非线性因素 线性模型的局限性: 假设一个简单…...
[蓝桥杯 2024 国 B] 蚂蚁开会
问题描述 二维平面上有 n 只蚂蚁,每只蚂蚁有一条线段作为活动范围,第 i 只蚂蚁的活动范围的两个端点为 (uix,uiy),(vix,viy)。现在蚂蚁们考虑在这些线段的交点处设置会议中心。为了尽可能节省经费,它们决定只在所有交点为整点的地方设置会议…...
GIT(AI回答)
在Git中,git push 命令主要用于将本地分支的提交推送到远程仓库(如GitHub、GitLab等)。如果你希望将本地分支的改动同步到另一个本地分支,这不是 git push 的设计目的。以下是正确的替代方法: 方法1࿱…...
JAVA学习-练习试用Java实现“TF-IDF算法 :用于文本特征提取。”
问题: java语言编辑,实现TF-IDF算法 :用于文本特征提取。 解答思路: TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的文本特征提取方法,用于评估一个词语对于一个文件集或一个语料库中的其中一份文件的…...

C++定长内存块的实现
内存池 内存池是指程序预先从操作系统 申请一块足够大内存 ,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是 直接从内存池中获取 ; 同理,当 **程序释放内存 **的时候,并不真正将…...
【判断自整除数】2022-4-6
缘由是判断自整除数的,这个我的结果是正确的,但是提交就有运行错误是怎么回事啊-编程语言-CSDN问答 void 自整除数字() {//所谓的自整除数字就是该数字可以整除其每一个位上的数字。 //对一个整数n,如果其各个位数的数字相加得到的数m能整除n,则称n为自…...
使用 Ansible 在 Windows 服务器上安装 SSL 证书系列之二
今天带大家实战一下如何通过ansible在windows 服务器上给iis web site安装证书。 前提条件: 准备一张pfx证书,可以通过openssl工具来生成,具体的步骤请参考帮助文档。一台安装了iis 的windows 服务器 准备inventory文件 [windows] solarwinds ansible_host=20.47.126.72 a…...

Unity使用代码分析Roslyn Analyzers
一、创建项目(注意这里不要选netstandard2.1会有报错) 二、NuGet上安装Microsoft.CodeAnalysis.CSharp 三、实现[Partial]特性标注的类,结构体,record必须要partial关键字修饰 需要继承DiagnosticAnalyzer 注意一定要加特性Diagn…...

大数据CSV导入MySQL
CSV Import MySQL 源码主要特性技术栈快速开始1. 环境要求2. 构建项目3. 使用方式交互式模式命令行模式编程方式使用 核心组件1. CsvService2. DatabaseService3. CsvImportService 数据类型映射性能优化1. 连接池优化2. 批量操作优化3. MySQL配置优化 配置说明application.yml…...
GitHub 趋势日报 (2025年06月04日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 1757 onlook 870 nautilus_trader 702 ChinaTextbook 582 system-design-primer 4…...
基于sqlite的任务锁(支持多进程/多线程)
前言 介绍 任务锁,在多进程服务间控制耗时任务的锁,确保相同id的耗时任务同时只有一个在执行 依赖 SqliteOp,参考这篇文章 https://blog.csdn.net/weixin_43721000/article/details/137019125 实现方式 utils/taskLock.py import timefrom utils.SqliteOp import Sqli…...

MySQL 索引优化(Explain执行计划) 详细讲解
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 MySQL 索引优化(Explain执行计划…...

Cad 反应器 cad c#二次开发
在 AutoCAD C# 二次开发中,DocumentCollectionEventHandler 是一个委托(delegate),用于处理与 AutoCAD 文档集合(DocumentCollection)相关的事件。它属于 AutoCAD .NET API 的事件处理机制,本质…...
GitOps 核心思想 - 当 Git 成为唯一信源
GitOps 核心思想 - 当 Git 成为唯一信源 在我们之前的 CI/CD 系列中,我们构建了一条流水线:GitHub Actions 在代码测试和构建通过后,执行 kubectl apply 命令将变更推送 (Push) 到 Kubernetes 集群。这种模式非常普遍且有效,但当系统规模和团队复杂度增加时,它可能会遇到一…...