Spring boot如何执行单元测试?

Spring Boot 提供了丰富的测试功能,主要由以下两个模块组成:

  • spring-boot-test:提供测试核心功能。
  • spring-boot-test-autoconfigure:提供对测试的自动配置。

Spring Boot 提供了一个 spring-boot-starter-test一站式启动器,如以下依赖配置所示。

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
</dependency>

测试启动器依赖不仅包含以上两个 Spring Boot模块,还包含 Spring Test 测试模块,以及其他

第三方测试类库,如下所示。

  • JUnit 5:Java 最主流的单元测试框架。
  • AssertJ:一款快速断言库。
  • Hamcrest:一款单元测试匹配库。
  • Mockito:一款 Mock 测试框架。
  • JSONassert:一款 JSON 断言库。
  • JsonPath:一款 JSON XPath 库。

更多测试相关的依赖可见具体的依赖关系树,如下图所示。
在这里插入图片描述

以上这些都是 Spring Boot 提供的常用的测试类库,如果上面的测试类库还不能满足你的需要,也可以任意添加以上没有的类库。

现在基本上使用的是 JUnit 5,如果应用还在使用JUnit 4 写的单元测试用例,那么也可以使用JUnit 5 的 Vintage 引擎来运行,如下面的依赖配置所示。

<dependency>
 <groupId>org.junit.vintage</groupId>
 <artifactId>junit-vintage-engine</artifactId>
 <scope>test</scope>
 <exclusions>
 <exclusion>
 <groupId>org.hamcrest</groupId>
 <artifactId>hamcrest-core</artifactId>
 </exclusion>
 </exclusions>
</dependency>

需要排除 hamcrest-core 依赖,因为该依赖已经改坐标了,并且默认内置在Spring Boot依赖管理中,如上面的依赖关系树所示,最新的 Hamcrest依赖已经是org.hamcrest:hamcrest坐标了。

Spring Boot提供了一个 @SpringBootTest 注解,用在单元测试类上以启用支持Spring Boot特性的单元测试,如果使用的是JUnit 4,那么测试类上还需要额外的@RunWith(SpringRunner. class)注解,然后在测试类方法上添加 @Test 注解即可,每一个 @Test 注解修饰的方法就是一个单元测试方法。

@SpringBootTest 注解有一个最重要的 webEnvironment 环境参数,支持以下几种环境设置:

  • MOCK(默认): 加载一个 Web ApplicationContext 并提供一个 Mock Web Environment,但不会启动内嵌的 Web 服务器,并可以结合 @AutoConfifigureMockMvcor@AutoConfifigure-WebTestClient 注解一起使用进行 Mock 测试。
  • RANDOM_PORT: 加载一个 WebServerApplicationContext,以及提供一个真实的 WebEnvironment,并以随机端口启动内嵌服务器。
  • DEFINED_PORT: 和 RANDOM_PORT 一样,不同的是 DEFINED_PORT 是以应用指定的端口运行的,默认端口为 8080。
  • NONE: 加载一个 ApplicationContext,但不会提供任何 Web Environment
    如果使用的 @SpringBootTest 注解不带任何参数,则默认为 Mock 环境。

真实环境测试

@SpringBootTest 注解中指定基于随机端口的真实Web环境,然后在类成员变量或者方法参数上注入 TestRestTemplate 实例,就可以完成对 Spring MVC接口的真实环境测试。

下面是一个基于随机端口的真实环境的测试用例:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MvcTest {
 @Test
 public void getUserTest(@Autowired TestRestTemplate testRestTemplate) {
 Map<String, String> multiValueMap = new HashMap<>();
 multiValueMap.put("username", "Java 技术栈 ");
 Result result = testRestTemplate.getForObject("/user/get?username={username}",
 Result.class, multiValueMap);
 assertThat(result.getCode()).isEqualTo(0);
 assertThat(result.getMsg()).isEqualTo("ok");
 }
 
}

测试当前应用下的 /user/get 接口,传入对应的用户名参数,最后检查接口返回结果是否和预期一致,测试结果如下图所示。

在这里插入图片描述

单元测试通过,从执行日志可以看到,它启动了一个嵌入式的 Tomcat 容器来测试真实的 Web应用环境。

Mock 环境测试

通过在类上面使用 @AutoConfifigureMockMvc 注解,然后在类成员变量或者方法参数上注入MockMvc 实例,就可以完成对 Spring MVC 接口的 Mock 测试。

下面是一个基于默认 Mock 环境的测试用例:

@SpringBootTest
@AutoConfigureMockMvc
class MockMvcTests {
 @Test
 public void getUserTest(@Autowired MockMvc mvc) throws Exception {
 mvc.perform(MockMvcRequestBuilders.get("/user/get?username={username}", "test"))
 .andExpect(status().isOk())
 .andExpect(content().string("{\"code\":0,\"msg\":\"ok\",\"
data\":\"test\"}"));
 }
}

测试当前应用下的 /user/get 接口,传入对应的用户名参数,最后检查请求状态是否OK(200),响应的内容是否和预期一致,测试结果如下图所示。
在这里插入图片描述

单元测试通过,从执行日志可以看到,它并未启动真实的 Web 环境来测试,而是使用 Mock 环境测试的。

Mock 组件测试

某些时候可能还需要模拟一些组件,比如某些服务只有上线之后才能调用,在开发阶段不可用,这时就需要 Mock 模拟测试了,提供各种模拟组件以完成测试。

Spring Boot 提供了一个 @MockBean 注解,可为 Spring 中的 Bean 组件定义基于 Mockito 的Mock 测试,它可以创建一个新 Bean 以覆盖 Spring 环境中已有的 Bean,它可以用在测试类、成员变量上,或者 @Confifiguration 配置类、成员变量上,被模拟的 Bean 在每次测试结束后自动重置。

假现现在有一个远程的服务 userService,本地不能调用,现在进行 Mock 测试,如以下使用示例所示。

@SpringBootTest
class MockBeanTests {
// @Autowired
// private UserService userService;
 @MockBean
 private UserService userService;
 @Test
 public void countAllUsers() {
 BDDMockito.given(this.userService.countAllUsers()).willReturn(88);
 assertThat(this.userService.countAllUsers()).isEqualTo(88);
 }
}

这里的 @MockBean 注解使用在 UserService 变量上,表明这个userService实例在当前测试用例中是被 Mock 覆盖的,如果要模拟的 Bean 有多个,则可以使用@Qualififier注解指定,然后通过Mockito 提供的代理工具类方法创建模拟返回数据,运行该服务的测试方法,当模拟数据和预期结果一致时才会测试通过。

这里通过 BDDMockito 工具类模拟 userService#countAllUsers方法并让它返回统计的用户总数(88),最后检查该方法的返回值是否和预期一致,测试结果如下图所示。

在这里插入图片描述

单元测试通过,也可以使用 @SpyBean 注解代替 @MockBean 注解,两者的区别是:

  • @SpyBean—如果没有提供 Mockito 代理方法,则会调用真实的 Bean 来获取数据。
  • @MockBean—不管有没有提供 Mockito 代理方法,都会调用 Mock 的 Bean 来获取数据。
    @MockBean@SpyBean 注解既可作用于 Mock 环境,也可作用于真实环境,它只是用来模拟、替换环境中指定的 Bean 而已,但不能用于模拟在应用上下文刷新期间 Bean 的行为,因为在执行测试用例时应用上下文已经刷新完成了,所以不可能再去模拟了,这种情况下建议使用 @Bean 方法来创建模拟配置。

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

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

相关文章

不是所有的Linux工具都会让人惊叹,但这个绝对让你叫绝

今天我要向大家介绍一款非常强大的系统诊断和监控工具——sysdig。它能替代top、iftop、lsof和strace等工具&#xff0c;让你的工作更加高效。下面让我举几个应用场景&#xff0c;让你亲眼见证它的强大&#xff01; 什么是sysdig sysdig是一款开源的系统诊断和监控工具&#…

排序算法-归并排序

Leetcode链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 归并&#xff1a;将原始数组划分为若干个子数组&#xff0c;然后将这些子数组分别排序&#xff0c;最后再将已排序的子数组合并成一个有序的数组。是一种分治思想 思路&#xff1a; 1.分 2.治 3.怎么治 …

Matlab实验:FIR数字滤波器设计

01.代码内容及原理 02.代码所有效果图 获取代码请关注MATLAB科研小白的个人公众号&#xff08;即文章下方二维码&#xff09;&#xff0c;并回复MATLAB实验&#xff1b;本公众号致力于解决找代码难&#xff0c;写代码怵。各位有什么急需的代码&#xff0c;欢迎后台留言~不定时更…

从零开始,构建智慧企业:人事管理软件新升级全攻略

本文从智能化人事管理的六大核心要素探讨如何打造一个适应现代企业需求的智能化人事管理系统&#xff0c;并介绍几款市场上表现优秀的人事管理软件。 随着我国经济的发展&#xff0c;企业全球化是大势所趋&#xff0c;难免会出现跨国员工数量增加、办公地点分散、跨部门协作等…

超图新建三维数据集继续学习

1 新建三维数据集 之前操作过新建三维数据集&#xff0c;还不熟悉&#xff0c;继续熟悉&#xff1b; 现在有一个文件型的数据源&#xff0c;名为swtest1&#xff1b;它前面小图标上有UDX三个字母&#xff0c;表明这是一个UDX类型的数据源&#xff1b;在此数据源上右击&#x…

vs2022 开始自己的第一个Python程序

这是针对于vs2022安装和使用教程&#xff08;详细&#xff09;创建Python项目的简单示例&#xff0c;旨在示范从项目搭建到程序运行的简单流程&#xff0c;代码就是打印Hello World&#xff0c;适合初次使用vs2022的用户~ 1.以Python为例&#xff0c;下拉到Python应用程序&…

c#仿ppt案例

画曲线 namespace ppt2024 {public partial class Form1 : Form{public Form1(){InitializeComponent();}//存放所有点的位置信息List<Point> lstPosition new List<Point>();//控制开始画的时机bool isDrawing false;//鼠标点击开始画private void Form1_MouseD…

一次普通的漏洞挖掘思路分享

No.0 前言 一名web安全小白&#xff0c;自己仅学了一点思路&#xff0c;直接实战&#xff0c;运气不错&#xff0c;碰到了管理员弱口令&#xff0c;进入后台后&#xff0c;继续测试自己学会的思路挖掘深一点的漏洞&#xff0c;这里与各位分享一下&#xff0c;如果有更多的思路…

01 - 半加器 异或门

---- 整理自B站UP主 踌躇月光 的视频 1. 半加器 ABSC0000011010101101 S A ‾ B A B ‾ C A B \begin{aligned} S & \overline{A}B A\overline{B} \\ C & AB \end{aligned} SC​ABABAB​ 2. 异或门 S A ‾ B A B ‾ \begin{aligned} S & \overline{A}B A\o…

如何评估编码器性能优劣?全方位检测方法与常见故障解决方案

编码器是一种电子或机械装置&#xff0c;其主要功能是将物理量&#xff08;如角位移、直线位移、速度、压力、温度等&#xff09;转换为相应的电信号&#xff0c;或者是将数据、信号或信息进行格式转换和编码&#xff0c;使其能够适应特定的通讯协议、传输介质或存储要求。 在…

当面试官问你插入排序算法,你敢说自己会吗?

算法学习的重要性 在程序员的世界里&#xff0c;算法就如同一座桥梁&#xff0c;连接着问题与解决方案&#xff0c;是实现优秀程序的关键。 掌握算法&#xff0c;就能够在面对各种问题时&#xff0c;找到最合适的解决方法&#xff0c;以最少的时间和空间&#xff0c;实现最优的…

力扣2684---矩阵中移动的最大次数(DFS,Java、中等题)

目录 题目描述&#xff1a; 思路描述&#xff1a; 代码&#xff1a; 纯递归&#xff1a; 带有记忆化搜索的递归&#xff1a; 题目描述&#xff1a; 给你一个下标从 0 开始、大小为 m x n 的矩阵 grid &#xff0c;矩阵由若干 正 整数组成。 你可以从矩阵第一列中的 任一 单…

环信IM集成教程——Web端UIKit快速集成与消息发送

写在前面&#xff1a; 千呼万唤始出来&#xff0c;环信Web端终于出UIKit了&#xff01;&#x1f389;&#x1f389;&#x1f389; 文档地址&#xff1a;https://doc.easemob.com/uikit/chatuikit/web/chatuikit_overview.html 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开…

蓝桥杯每日不知道多少题之昂贵的聘礼

制作不易望点赞收藏加关注~~~&#xff0c;以便不时之需 题目连接&#xff1a;903. 昂贵的聘礼 - AcWing题库 解题思路&#xff1a;虚拟一个物品0&#xff0c;然后反向建边&#xff0c;边权为物品0到物品i所花费的价格&#xff0c;以及物品i换物品j所省下的钱&#xff0c;然后…

【Spring】SpringBoot整合ShardingSphere并实现多线程分批插入10000条数据(进行分库分表操作)。

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、ShardingSphere简介 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈&#xff0c;它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar&#xff08;计划中&#xff09;这3款相互独立的产品组成…

强化学习笔记系列入门【0】

引言: 最近在学习西湖大学赵世钰老师的强化学习课程,一直觉得学习一定是一个不仅有输入还需要及时给出自己输出的一个过程,但在中国的大学或者研究生课堂,这一部分是相当缺失的,氛围经常性的很差。其实,课堂,我觉得就很有必要去做一些翻转课堂之类的东西,去打破现在这种…

【算法刷题day14】Leetcode:144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历

文章目录 二叉树递归遍历解题思路代码总结 二叉树的迭代遍历解题思路代码总结 二叉树的统一迭代法解题思路代码总结 草稿图网站 java的Deque 二叉树递归遍历 题目&#xff1a; 144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉树的后序遍历 解析&#xff1a;代码随想录解析…

黄金票据复现

一、黄金票据攻击介绍 黄金票据攻击是网络安全领域中一种重要的渗透攻击手段。它利用Kerberos身份认证协议中的漏洞&#xff0c;允许攻击者伪造域控krbtgt用户的TGT&#xff08;Ticket-Granting Ticket&#xff09;。一旦攻击者成功伪造了TGT&#xff0c;他们就可以访问网络中…

千山至臻蜜密40°C的蜂蜜质量怎么样?

千山至臻蜜密40℃是经中国蜂产品协会认证的全国五星级蜂蜜品牌&#xff0c;中国蜂产品协会是全国最高最权威的认证机构&#xff0c;产品质量是毋庸置疑的。 千山至臻中蜂百花蜜对产品质量的管控可以用非常严苛来形容。 一是蜂场选择在方圆五公里的无人区&#xff08;中蜂的采…

hadoop 高可用(HA)、HDFS HA、Yarn HA

目录 hadoop 高可用(HA) HDFS高可用 HDFS高可用架构 QJM 主备切换&#xff1a; Yarn高可用 hadoop 高可用(HA) HDFS高可用 HDFS高可用架构 QJM 主备切换&#xff1a; Yarn高可用