当前位置: 首页 > news >正文

单元测试之 - Spring框架提供的单元/集成测试注解

Spring框架提供了很多注解来辅助完成单元测试和集成测试(备注:这里的集成测试指容器内部的集成测试,非系统间的集成测试),先看看Spring框架提供了哪些注解以及对应的作用。@RunWith(SpringRunner.class) / @ExtendWith(SpringExtension.class)
用于在测试类中启用 Spring 框架的支持。@RunWith 是 JUnit 4 的注解,而 @ExtendWith 是 JUnit 5 的注解,用于取代 @RunWith。
这些注解会加载 Spring 上下文,支持 Spring 相关的功能如依赖注入和使用 Spring 注解等。
@SpringBootTest:
用于在测试类中加载完整的 Spring Boot 应用程序上下文。自动配置应用程序上下文,包括所有的配置、Bean 和组件,以及所有相关的依赖项。通常与 @RunWith 或 @ExtendWith 一起使用。
@AutoConfigureMockMvc:
自动配置 MockMvc 对象,用于模拟 Spring MVC 请求和响应。通常与 @SpringBootTest 结合使用,用于测试 MVC 控制器层的行为。
@DataJpaTest:
用于测试与 JPA 相关的功能。自动配置嵌入式数据库,并加载与 JPA 相关的组件。仅加载 JPA 相关的组件,提高测试的精确性和速度。
@WebMvcTest:
用于测试 Spring MVC 控制器层的功能。自动配置 MockMvc,并加载控制器层相关的组件,如控制器、拦截器等。通常需要手动指定需要加载的其他组件。
@DataMongoTest:
用于测试与 MongoDB 相关的功能。自动配置嵌入式 MongoDB,并加载与 MongoDB 相关的组件。
@RestClientTest:
用于测试使用 Spring 的 RestTemplate 进行 HTTP 请求的功能。自动配置 RestTemplateBuilder,并加载相关的组件。
@Sql:
用于在测试执行前或执行后运行 SQL 脚本。可以用于准备测试数据或清理测试环境。
@TestPropertySource:
用于在测试中指定要加载的属性文件。可以覆盖应用程序中的属性配置,方便测试不同的配置。 

可以看到在上面的注解中,@AutoConfigureMockMvc和@WebMvcTest都是用于测试Controller层的测试,那么他们之间有什么区别呢?@AutoConfigureMockMvc 用于单元测试或轻量级的集成测试,只自动配置 MockMvc,主要关注控制器的行为测试。@WebMvcTest 用于集成测试,除了自动配置 MockMvc,还会加载控制器层相关的组件,可以测试整个控制器层的功能和交互。

上面是一些概念介绍,下面看看具体例子。如下图所示,controller层中有一个post方法,为这个post方法编写单元测试,里面用的了mockMvc注解。对于Controller class依赖的usersService Class,下面的测试中用了@MockBean注解,这样可以在后面控制usersService的行为,例如 given(userService.createUser(any(UserDto.class))).willReturn(userDto);因为对userService的行为进行的stub,这样controller层方法返回的结果也是受控制的,在后面的单元测试中,就隔离了对usersService实际结果的依赖,只测试controller层的代码逻辑。

为了更好的理解mockMvc可以再看下面一个更简单的例子,下面例子中左边是一个BookController的假代码,右边是对这个Controller的单元测试代码。class上面使用@WebMvcTest注解,用@MockBean管理依赖的服务bookService,用mockMvc模拟发起请求,接着通过.andExpect()验证得到的结果是否符合预期。

 上面是编写单元测试,如果要为controller层的接口编写容器内的集成测试呢?具体测试如下所示:集成测试中会用到@SpringBootTest注解,,用restTemplate在启动的本地端口上调用controller层的接口,然后校验接口返回内容。

除了controller层的单元测试和集成测试,我们再来看看spring框架提供的其他常用注解使用例子。如下图所示使用@DataMongoTest注解编写Repository层class的单元测试,使用@DataMongoTest 注解,它会加载 BookRepository 相关的组件,并创建一个嵌入式 MongoDB 数据库。另外,还使用了 @TestPropertySource 注解来指定 MongoDB 的连接属性,这样测试可以连接到指定的数据库。

需要注意:在实际项目DB层通常都有现成的框架来负责数据的CRUD,例如spring jpa等,自身写的额外查询、修改数据的逻辑较少,如果要为repository层编写单元测试,应该重点对定制化了sql语句的repository层代码。

和@MongoTestdata注解类似的,还有@DataJpaTest注解,@DataJpaTest是 Spring Boot 测试框架中用于测试与 JPA 相关的功能的注解。它提供了一个轻量级的方式来测试 JPA 数据访问层(Repository)的功能,而不需要加载整个 Spring Boot 应用程序上下文。下图是使用@DataJpaTest注解为Repository层代码添加单元测试例子。

 使用了@DataJpaTest注解,它会加载BookRepository相关的组件,并创建一个嵌入式数据库(H2 数据库)。另外,还使用了 @TestPropertySource 注解来指定数据库的连接属性,这样测试可以连接到指定的数据库。需要注意一点,因为这个注解是专门为Spring Jpa框架创建的,如果数据库选的框架不是spring jpa,那么,则无法使用@DataJpaTest注解。

除了前面数据库相关的注解外,再来看看如何使用@RestClientTest注解。下图是使用@RestClientTest注解为使用了restTemplate调用外部接口的代码添加单元测试,使用了 @RestClientTest(BookClient.class) 注解,它会加载 BookClient 相关的组件,并创建一个带有 MockRestServiceServer的RestTemplate 实例。MockRestServiceServer 可以用于模拟外部 REST 服务的响应,从而测试 BookClient 与外部服务的交互。

以上就是Spring框架提供的常用测试相关注解的使用说明。

相关文章:

单元测试之 - Spring框架提供的单元/集成测试注解

Spring框架提供了很多注解来辅助完成单元测试和集成测试(备注:这里的集成测试指容器内部的集成测试,非系统间的集成测试),先看看Spring框架提供了哪些注解以及对应的作用。RunWith(SpringRunner.class) / ExtendWith(SpringExtension.class)&…...

深入学习 Redis - 事务、实现原理、指令使用及场景

目录 一、Redis 事务 vs MySQL事务 二、Redis 事务的执行原理 2.1、执行原理 2.2、Redis 事务设计这么简单,为什么不涉及成 MySQL 那样强大呢? 三、Redis 事务的使用 3.1、使用场景 3.2、具体演示 开启/执行/放弃事务 watch 监控 watch 实现原理…...

异步javaScript

在本文中,我们将解释什么是异步编程,为什么我们需要它,并简要讨论 JavaScript 历史上异步函数是怎样被实现的。 预备知识:基本的计算机素养,以及对 JavaScript 基础知识的一定了解,包括函数和事件处理程序…...

看跨境电商世界区域分布,Live Market教你深入参与跨境创业

随着全球化发展带来互联网技术的进步和平台经济的触角伸向全球,跨境电商越来越成为全球贸易的重要组成部分。根据国际数据公司(IDC)的最新数据显示,全球前五大跨境电商平台分别是亚马逊、阿里巴巴、eBay、Wish和京东全球购。这五家…...

python中的装饰器的真正含义和用法

闭包: 闭包是python中的一个很实用的写法,可以使得用户在函数中调用该函数外的函数的变量,使得该变量常驻于内存中。 闭包函数: 输入是函数,输出也是一个函数。 装饰器的写法是python闭包的语法糖。 面试中经常面…...

opencv基础-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。 例如,在图 8-17 中,通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔(内部闭合的…...

RocketMQ生产者和消费者都开启Message Trace后,Consume Message Trace没有消费轨迹

一、依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.3</version> </dependency>二、场景 1、生产者和消费者所属同一个程序 2、生产者开启消…...

JDV背后的技术-助力618 | 京东云技术团队

一、项目介绍 JDV&#xff08;可视化大屏&#xff09;是京东内部搭建可视化大屏的数据工具平台&#xff0c;内置10种模版特效&#xff0c;40种风格各异的图表、导航等组件。与集团其他数据工具打通&#xff0c;支持一站式、自助化、拖拽式搭建大屏&#xff0c;实现数据切换、联…...

0基础学习VR全景平台篇 第78篇:全景相机-拍摄VR全景

新手入门圆周率科技&#xff0c;成立于2012年&#xff0c;是中国最早投身嵌入式全景算法研发的团队之一&#xff0c;亦是全球市场占有率最大的全景算法供应商。相继推出一体化智能屏、支持一键高清全景直播的智慧全景相机--Pilot Era和Pilot One&#xff0c;为用户带来实时畅享…...

Spring MVC简介与概述

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

java基础复习(第六日)

java基础复习(五) 1.是否了解类似 RabbitMQ.kalka 之类的队列服务? 请简述队列取务中的常见要素和使用场景&#xff1f; 了解&#xff0c;队列服务是一种应用间的通信方式&#xff0c;可以实现异步处理、应用解耦、流量削峰和消息通信等功能 队列服务的常见要素&#xff1a…...

商用服务机器人公司【Richtech Robotics】申请纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国内华达州拉斯维加斯由华人领导的商用服务机器人公司【Richtech Robotics】近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&am…...

关于nn.Embedding如何使用预定义词表

直接使用&#xff0c;则是没有pretrained的词表。 若要使用预定义词表&#xff0c;则可以用 pretrained_weight np.array(pretrained_weight) embeds.weight.data.copy_(torch.from_numpy(pretrained_weight))参考&#xff1a; https://wmathor.com/index.php/archives/1435/…...

怎么设置文件夹密码?文件夹密码设置方法合集

为文件夹设置密码可以有效地保护文件夹的数据安全&#xff0c;那么该怎么设置文件夹密码呢&#xff1f;下面我们来一起了解一下。 文件夹保护3000 想要简单快捷的为文件夹设置密码&#xff0c;那么&#xff0c;文件夹保护3000就是最佳的选择。它提供了3种文件夹保护方式&#…...

PEMFC氢氧质子交换燃料电池MATLAB仿真模型

氢氧燃料电池静态模型&#xff1a; &#xff08;1&#xff09;热力学电动势En &#xff08;2&#xff09;活化极化过电势Vact 活化损失主要是因为电极表面的反应速度过慢&#xff0c;在驱动电子传递到或者传送出电极的化学反应时&#xff0c;部分电压会被消耗。 &#xff08;…...

创建PVC注意事项

On the one hand 创建永久卷&#xff08;Persistent Volume Claim&#xff0c;PVC&#xff09;时需要考虑以下几个因素&#xff1a; 存储类别&#xff08;Storage Class&#xff09;&#xff1a;选择适合需求的存储类别是创建 PVC 的第一步。存储类别定义了永久卷的属性&…...

Sencha Ext.NET Crack 快速应用程序的正确工具集

Sencha Ext.NET Crack 快速应用程序的正确工具集 Sencha Ext.NET是一个高级的ASP.NET核心组件框架&#xff0c;它包含了强大的跨浏览器Sencha Ext JS库。通过140多个预构建和专业测试的UI组件实现企业级性能和生产效率。Sencha Ext.NET使用尖端的Web技术创建功能强大的Web应用程…...

transformer学习

transformer 李宏毅老师的课&#xff1a;https://www.youtube.com/watch?vugWDIIOHtPA&listPLJV_el3uVTsOK_ZK5L0Iv_EQoL1JefRL4&index60 知乎上的文章&#xff1a;Transformer模型详解&#xff08;图解最完整版&#xff09; 主要参考tensorflow的官方文档&#xf…...

基于LNMP架构搭建Discuz论坛

LNMP: L---->linux系统&#xff0c;操作系统。 N----->nginx网站服务&#xff08;前端),提供前端的静态页面服务。同时具有代理、转发的作用。&#xff08;转发就是转发后端请求&#xff0c;转发PHP&#xff09;&#xff0c;nginx没有处理动态资源的功能&#xff0c;他有…...

乐鑫科技2021笔试题

笔试时间&#xff1a;2020.09.09&#xff0c;10&#xff1a;00-11&#xff1a;30 岗位&#xff1a;嵌入式软件工程师 题型&#xff1a;单选题20道&#xff0c;40分。编程题2道&#xff0c;60分。 单选题 1、算术右移指令执行的操作是&#xff1f;符号位会变化吗&#xff1f…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法

使用 ROS1-Noetic 和 mavros v1.20.1&#xff0c; 携带经纬度海拔的话题主要有三个&#xff1a; /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码&#xff0c;来分析他们的发布过程。发现前两个话题都对应了同一…...