当前位置: 首页 > 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…...

VL 模型 Open-Set Domain Adaptation with Visual-Language Foundation Models 论文阅读笔记

Open-Set Domain Adaptation with Visual-Language Foundation Models 论文阅读笔记 一、Abstract 写在前面 又是一周周末&#xff0c;在家的时间感觉过得很快呀。今天没得时间写博客&#xff0c;留下个标题&#xff0c;明天搞完。 论文地址&#xff1a;Open-Set Domain Adapta…...

在IDEA同一个窗口中同时打开多个独立项目

文章说明 本文主要说明如何在Intellij Idea中同时打开多个独立的Maven项目。 我在使用idea的时候&#xff0c;由于自己负责了很多项目&#xff0c;经常要在不通的代码之间切换来切换去。然后搜索代码的时候也只能搜到当前打开的这个项目。因为这个原因&#xff0c;一些小项目…...

flask-session、数据库连接池

flask 自带session---》以cookie的形式放到了浏览器中---》加密 真正的session&#xff0c;是在服务端存储 -django中存在djangosession表中 -flask中&#xff0c;使用第三方&#xff0c;保存在---》redis中---》flask-session 使用步骤 pip install flask-session …...

基于EEGLAB的ICA分析

目录 1.ICA原理 2.ICA的实现 3.ICA成分识别 4.ICLabel识别并去除伪迹 5.ICA成分识别练习 1.ICA原理 得到的每一个地形图&#xff0c;实际上就是它的权重谱。 投射&#xff1a;根据原成分恢复原始信号。 选择性投射&#xff1a;去伪。 2.ICA的实现 extended&#xff0c;1&…...

Pytorch深度学习-----神经网络之线性层用法

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…...

代码随想录算法训练营day58

文章目录 Day58 每日温度题目思路代码 下一个更大元素 I题目思路代码 Day58 每日温度 739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 题目 请根据每日 气温 列表&#xff0c;重新生成一个列表。对应位置的输出为&#xff1a;要想观测到更高的气温&#xff0c;至少需…...

Grafana集成prometheus(4.Grafana添加预警)

上文已经完成了grafana对prometheus的集成及数据导入&#xff0c;本文主要记录grafana的预警功能&#xff08;以内存为例&#xff09; 添加预警 添加入口&#xff08;2个&#xff09; databorard面板点击edit&#xff0c;下方有个Alert的tab&#xff0c;创建Alert rules依赖…...

宏观上看Spring创建对象的过程

宏观上看Spring创建对象的过程 对于对象而言&#xff0c;可以分为简单对象和复杂对象&#xff1b; 简单对象 简单对象指可以直接new的对象&#xff1b; Spring在创建这些对象时&#xff0c;是基于反射来完成的。复杂对象 复杂对象指不能直接new的对象。 比如&#xff1a;要得到…...

Jtti:linux如何配置dns域名解析服务器

要配置Linux上的DNS域名解析服务器&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 安装BIND软件包&#xff1a;BIND是Linux上最常用的DNS服务器软件&#xff0c;您可以使用以下命令安装它&#xff1a; sudo apt-get install bind9 2. 配置BIND&#xff1a;BIND的配置…...

上网速度慢解决方案

方法 1&#xff1a;手动设置 Proxy 服务器 假如你是使用宽带的用户&#xff0c;使用宽带路由器后可能会发觉无法浏览一些网页&#xff0c;其中一个原因是一些 ISP 商 在后台使用了隐形的代理服务器&#xff0c;使部分网页无法正常显示。假如你多次按“F5”键也无法刷新网页&…...