单元测试之 - 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框架提供的常用测试相关注解的使用说明。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

KepwareEX配置API REST接口

服务端Kepware设置 API允许连接设置 创建通道 请求地址(POST)&#xff1a; https://<主机名_或_ip>:<端口>/config/v1/project/channels 以下示例使用postman工具访问API创建了一个名为Channel1 的通道&#xff0c;其使用在本地主机运行的服务器中的Simulator …

VSCode如何在行内显示变量值

背景 在调试时&#xff0c;我们希望能够直接在代码行显示变量的值&#xff0c;而不是总是去侧边栏查看&#xff0c;如下这种&#xff0c;y12直接显示在代码行。那么VSCode中如何做呢 设置 VSCode提供了“inline values”设置&#xff0c;但为了速度&#xff0c;默认并没有开…

Python3 网络爬虫开发实战

第二章 基本库的使用 urlib的使用 比较好用的是parse模块来进行URL的各种处理&#xff0c; requests的使用 requests库也可以session维持&#xff0c;srequests.Session(),s.get(url‘…’) 有些网站没有设置好HTTPS证书&#xff0c;导致出现不是私密连接的错误&#xff0c…

Ubuntu开机自启服务systemd.service配置教程(Ubuntu服务)(Linux服务)upstart

文章目录 为什么要将程序配置成服务&#xff1f;1. 自动启动2. 后台运行3. 定时重启4. 简化管理5. 整合系统 版本支持1. Ubuntu 14.04及更早版本&#xff1a;使用upstart作为默认的init系统/etc/rc.local旧版本新版本 2. Ubuntu 15.04到16.04版本&#xff1a;默认使用systemd作…

6.s081/6.1810(Fall 2022)Lab5: Copy-on-Write Fork for xv6

前言 本来往年这里还有个Lazy Allocation的&#xff0c;今年不知道为啥直接给跳过去了。. 其他篇章 环境搭建 Lab1: Utilities Lab2: System calls Lab3: Page tables Lab4: Traps Lab5: Copy-on-Write Fork for xv6 参考链接 官网链接 xv6手册链接&#xff0c;这个挺重要…

【云原生】Docker-compose中所有模块学习

compose模块 模板文件是使用 Compose 的核心&#xff0c;涉及到的指令关键字也比较多。但大家不用担心&#xff0c;这里面大部分指令跟 docker run 相关参数的含义都是类似的。 默认的模板文件名称为 docker-compose.yml&#xff0c;格式为 YAML 格式。 version: "3&quo…

【从零学习python 】02. 开发工具介绍

文章目录 编写Python代码一、常见的代码编辑工具二、运行Python程序三、Pycharm的下载和安装PyCharm的主要功能区域进阶案例 编写Python代码 根据我们之前介绍的知识&#xff0c;我们知道&#xff0c;所谓代码其实就是将一段普通文本按照一定的规范编写&#xff0c;然后交给电…

人工智能的缺陷

首先从应用层面理解什么是人工智能&#xff0c;目前人工智能主流应用面包括&#xff1a;自然语言处理领域&#xff0c;代表为chatgpt&#xff0c;我们能用其进行日常交流&#xff0c;问题答疑&#xff0c;论文书写等。计算机视觉领域&#xff0c;代表为人脸识别&#xff0c;现在…

百度UEditor编辑器如何关闭抓取远程图片功能

百度UEditor编辑器如何关闭抓取远程图片功能 这个坑娘的功能&#xff0c;开始时居然不知道如何触发&#xff0c;以为有个按钮&#xff0c;点击一下触发&#xff0c;翻阅了文档&#xff0c;没有发现&#xff0c;然后再网络上看到原来是复制粘贴非白名单内的图片到编辑框时触发&a…

centos7 yum源安装出错及更新问题

如下 首先&#xff0c;在搜索jdk时报错如下&#xff1a; 解决办法 1、进入 yum的repo目录 cd /etc/yum.repos.d/2、修改所有的CentOS文件内容 sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-*sed -i s|#baseurlhttp://mirror.centos.org|baseurlhttp://vau…

Rust 编程小技巧摘选(7)

Rust 编程小技巧(7) 1. 结构体 Display trait 结构体的两种形式&#xff0c;对应的成员取法不同&#xff1b; 前者用 self.成员变量名 self.x, self.y&#xff1b;后者用 self.成员索引号 self.0, self.1, self.2, ...... use std::fmt::Display; use std::fmt::Result; us…

如何从 Android 设备恢复已删除的文件?

从 Android 设备恢复已删除的文件很简单&#xff0c;但您需要了解内部恢复和SD 卡恢复之间的区别。 目前销售的大多数 Android 设备都配备了 SD 卡插槽&#xff08;通常为 microSD&#xff09;&#xff0c;可以轻松添加额外的存储空间。该存储空间可用于存储照片、视频、文档&a…

配置Hive远程服务详细步骤

HiveServer2支持多客户端的并发和认证&#xff0c;为开放API客户端如JDBC、ODBC提供了更好的支持。 &#xff08;1&#xff09;修改hive-site.xml&#xff0c;在文件中添加以下内容&#xff1a; <property><name>hive.metastore.event.db.notification.api.auth&l…

ArcGIS Pro简介下载安装地址

ArcGIS Pro简介 ArcGIS Pro是一款功能强大的地理信息系统&#xff08;GIS&#xff09;软件&#xff0c;由Esri开发。它为用户提供了一种直观、灵活且高效的方式来处理、分析和可视化地理数据。ArcGIS Pro具有现代化的用户界面和工作流程&#xff0c;使用户能够更好地利用地理信…

【Linux】节点之间配置免密登录

文章目录 1、实现2、原理3、SSH的理解 1、实现 先写实现&#xff0c;解决问题后有兴趣的自己看后面的原理。 以实现节点A&#xff08;主&#xff09;免密登录到节点B&#xff08;从&#xff09;为例&#xff1a;&#xff08;注意例子里节点B被登录&#xff09; 步骤一&#xf…

L2CS-Net: 3D gaze estimation

L2CS-Net: Fine-Grained Gaze Estimation in Unconstrained Environments论文解析 摘要1. 简介2. Related Work3. METHOD3.1 Proposed loss function3.2 L2CS-Net 结构3.3 数据集3.4 评价指标 4. 实验4.1 实验结果 论文地址&#xff1a;L2CS-Net: Fine-Grained Gaze Estimation…

Mysql主从复制-主库/从库

介绍 mysql的主从复制是一个异步的复制过程&#xff0c;底层是基于Mysql数据库自带的二进制日志功能&#xff0c;就是一台或多台数据库&#xff08;slave,从库&#xff09;从另一台MYSQL数据库&#xff08;master,主库&#xff09;进行日志的复制然后再解析并应用到自己&#…

IO进程线程第五天(8.2)进程函数+XMind(守护进程(幽灵进程),输出一个时钟,终端输入quit时退出时钟)

1.守护进程&#xff08;幽灵进程&#xff09; #include<stdio.h> #include<head.h> int main(int argc, const char *argv[]) {pid_t cpid fork();if(0cpid){ //创建新的会话pid_t sidsetsid();printf("sid%d\n",sid);//修改运行目录为不可卸载的文件…

K8S系列文章之 自动化运维利器 Ansible

Ansible-安装 第一步&#xff1a;安装我们的epel扩展源 yum -y install epel-release 我这里会报/var/run/yum.pid 已被锁定&#xff0c;如果没有直接进行下一步 [rootmaster home]# yum -y install epel-release 已加载插件&#xff1a;fastestmirror, langpacks /var/run/…

计算机网络—TCP和UDP、输入url之后显示主页过程、TCP三次握手和四次挥手

TCP基本认识 TCP是面向连接的、可靠的&#xff0c;基于字节流的传输层通信协议。 图片来源小林coding 序号&#xff1a;传输方向上字节流的字节编号。初始时序号会被设置一个随机的初始值&#xff08;ISN&#xff09;&#xff0c;之后每次发送数据时&#xff0c;序号值 ISN…