Spring Boot 中单元测试框架 Mockito 的正确使用

Spring Boot 中单元测试框架 Mockito 的正确使用

本文是对前段时间修复老项目单元测试的总结记录,在修复过程中,发现中文互联网中的不少文章对单元测试框架Mockito的使用说明基本不准确又或是AI生成,希望我这篇能够把这方面简单说透说对。
文章最后给到一个比较规矩的单元测试示例,基本的单元测试对照着写足够用。

下文主要提及如下框架:

  1. Spring Boot
  2. Mockito
  3. PowerMock

文章也可移步至 AllinProgram.com 查看。

Spring Boot编写单元测试

若只是希望使用Junit编写比较简单的单元测试,建议直接引入Spring Boot官方的测试依赖spring-boot-starter-test,其内置了版本兼容的JunitMockito,开箱即用。

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

如何Mock静态方法

上文提到 spring-boot-starter-test已经引入 Mockito,方便你对 Bean进行Mock,但是你可能会发现其无法针对静态方法进行Mock。

此时,你可以检查下其引入的 Mockito的具体版本,因为不同版本在Mock静态方法时的操作是不一样的。

主要可以分为Mockito的版本是否小于v3.0.0。

Mockito的版本小于v3.0.0

需要配合 PowerMock使用以支持Mock静态方法!!!

  • 其版本对应关系可以查看supported-versions,但请你先别急着引入该框架,继续往后看。
MockitoPowerMock
2.8.9+2.x
2.8.0-2.8.91.7.x
2.7.51.7.0RC4
2.4.01.7.0RC2
2.0.0-beta - 2.0.42-beta1.6.5-1.7.0RC
1.10.8 - 1.10.x1.6.2 - 2.0
1.9.5-rc1 - 1.9.51.5.0 - 1.5.6
1.9.0-rc1 & 1.9.01.4.10 - 1.4.12
1.8.51.3.9 - 1.4.9
1.8.41.3.7 & 1.3.8
1.8.31.3.6
1.8.1 & 1.8.21.3.5
1.81.3
1.71.2.5
  • 具体使用Demo可以查看Mocking Static Method。

我更加建议你将 Mockito升级到大于v3.0.0的版本使用,其会更加简单稳定。

<!-- 仅需引入mockito-inline足矣,适用Junit4 -->
<dependency><groupId>org.mockito</groupId><artifactId>mockito-inline<artifactId><version>4.11.0</version><scope>test</scope>
</dependency>

Mockito的版本大于v3.0.0

直接展示下如何使用。

// 放在try中其Mock会自动关闭,建议都这么做,以免影响其他单元测试
try (MockedStatic<StaticExampleClass> staticExampleClassMock = Mockito.mockStatic(StaticExampleClass.class) ){staticExampleClassMock.when(StaticExampleClass::execXxx).thenReturn("");// 编写业务代码单元测试
}

一个比较规矩的单元测试示例

其他一些问题

若你的Sping版本比较低,但是使用Mockito的版本比较高,比如上面我提到的4.11.0,可能会出现这些错误信息:

java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)Caused by: java.lang.IllegalStateException: Failed to load interface Caused by: java.lang.reflect.InvocationTargetExceptionat sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at Caused by: org.mockito.exceptions.base.MockitoInitializationException: 
It seems like you are running Mockito with an incomplete or inconsistent class path. Byte Buddy could not be loaded.Byte Buddy is available on Maven Central as 'net.bytebuddy:byte-buddy' with the module name 'net.bytebuddy'.
For the inline mock maker, 'net.bytebuddy:byte-buddy-agent' with the module name 'net.bytebuddy.agent' is also required.
Normally, your IDE or build tool (such as Maven or Gradle) should take care of your class path completion but at org.mockito.internal.exceptions.Reporter.missingByteBuddyDependency(Reporter.java:1131)

此时,请检查项目中实际依赖情况:

  1. 实际引入mockito-core的版本是否与mockito-inline内置依赖版本一致?
  2. 实际引入byte-buddybyte-buddy-agentobjenesis的版本是否与mockito-core内置依赖版本一致?

若不一致,请手动显式添加上述依赖,并令其版本为mockito-coremockito-inline内置对应版本。

值得一提的是,Mockito官方开发团队给出了上述第二个问题的发生原因:

Unfortunately Spring hardcodes a specific (older) version of ByteBuddy, which becomes problematic for evergreen projects such as Mockito. Therefore, explicitly specify version.

That’s all~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】函数

1. 函数简介 SQL 语言中&#xff0c;包括了内置函数和自定义函数。内置函数是系统内置的通用函数&#xff0c;而自定义函数是我们根据自己的需要编写的。MySQL提供的内置函数实现的功能角度可以分为 数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、获取…

学习OpenCV——CV_8UC1、CV_16UC1、CV_32FC1等对应的整数值及计算方法(一)

学习OpenCV——CV_8UC1、CV_16UC1、CV_32FC1等对应的整数值及计算方法&#xff08;一&#xff09; 1.代码段2.计算方法举例3.直接给出其余对应结果 1.代码段 以下取自OpenCV文档 #define CV_BIG_INT(n) #define CV_BIG_UINT(n) #define CV_CN_MAX 512 #define CV…

等保合规:保护企业网络安全的必要性与优势

前言 无论是多部网络安全法律法规的出台&#xff0c;还是最近的“滴滴被安全审查”事件&#xff0c;我们听得最多的一个词&#xff0c;就是“等保。” 只要你接触安全类工作&#xff0c;听得最多的一个词&#xff0c;一定是“等保。” 那么&#xff0c;到底什么是“等保”呢…

Redis网络相关的结构体 和 reactor模式

目录 1. epoll的封装 结构体aeApiStae 创建epoll fd的封装 epoll_ctl的封装 epoll_wait的封装 2. 结构体aeFileEvent、aeFiredEvent、aeTimeEvent 结构体aeFileEvent 结构体aeFiredEvent 结构体aeTimeEvent 3. struct aeEventLoop aeEventLoop相关的函数 1. 创建eve…

Rust HTTP 客户端:易于使用、功能强大 | 开源日报 No.228

seanmonstar/reqwest Stars: 8.9k License: Apache-2.0 reqwest 是一个易于使用且功能强大的 Rust HTTP 客户端。 异步和阻塞客户端支持普通数据、JSON、urlencoded 和 multipart 数据格式可定制的重定向策略支持 HTTP 代理和系统原生 TLS 或 rustls 的 HTTPSCookie 存储功能…

JVM学习笔记(五)内存模型

目录 1、原子性 1.1 问题分析 1.2 解决方法 2、可见性 2.1 退不出的循环 2.2 解决办法 3、有序性 3.1 诡异的结果 3.2 解决办法 3.3 有序性理解 3.4 happens-before 4、CAS与原子类 4.1 CAS 4.2 乐观锁与悲观锁 4.3 原子操作类 5、synchronized 优化 5.1 轻量…

17(第十六章,数据管理组织与角色期望)

目录 概述 基本概念 首席数据官 个人角色 执行官角色 业务角色 IT角色 混合角色 组织架构模式 概述 本章书上的重点内容其实不多&#xff0c;了解的地方例如数据管理组织的结构包括分散、网络、混合、联邦、集中等运营模式。 之前也提过的RACI&#xff08;谁负责&am…

【域适应十九】CDTRANS: CROSS-DOMAIN TRANSFORMER FOR UN-SUPERVISED DOMAIN ADAPTATION

motivation 无监督域自适应旨在将学习到的知识从一个有标记的源领域转移到另一个无标记的目标领域。大多数现有的UDA方法都是使用基于卷积神经网络(cnn)的框架,从领域层面或类别层面学习域不变特征表示。基于类别级别的UDA的一个基本问题是为目标域中的样本产生伪标签,这些伪…

AWTK MODBUS Client channel 模型

名称&#xff1a;modbus_client_channel 功能&#xff1a;通过 modbus 协议访问远程 slave 设备上的数据&#xff0c;需要配合 modbus_client模型一起使用。用于将 modbus client 中的 channel 包装成view_model或者view_model_array 一般来说不需要&#xff0c;直接使用modbus…

MySQL怎么提升主从复制性能

在MySQL主从复制结构中&#xff0c;随着连接至数据源的副本数增加&#xff0c;尽管负载相对较小&#xff0c;但仍会增加负载&#xff0c;因为每个副本都要和数据源建立一个客户端连接。此外&#xff0c;由于每个副本都必须接收到源二进制日志的完整副本&#xff0c;源上的网络负…

CentOS 系统的优缺点

CentOS &#xff08;社区企业操作系统的缩写&#xff09;是一个基于红帽企业 Linux (RHEL)的免费开源发行版&#xff0c; 旨在为服务器和工作站提供稳定、可靠和安全的平台。 不应将其与CentOS Stream 混淆&#xff0c;后者是即将发布的 RHEL 版本的上游开发平台。 CentOS Li…

C++初阶之入门

零、什么是C C是基于C语言而产生的&#xff0c;它既可以进行C语言的过程化程序设计&#xff0c;又可以进行以抽象数据类型为特点的基于对象的程序设计&#xff0c;还可以进行面向对象的程序设计。 C缺点之一&#xff0c;是相对许多语言复杂&#xff0c;而且难学难精。许多人说学…

一般神经网络的微分与网络参数的初始化

(文章的主要内容来自电科的顾亦奇老师的 Mathematical Foundation of Deep Learning, 有部分个人理解) 一般深度神经网络的微分 上周讨论的前向和反向传播算法可以推广到任意深度神经网络的微分。 对于一般的网络来说&#xff0c;可能无法逐层分割&#xff0c;但仍然可以用流…

抖音小店运营过程中,每天必须要做的7件事情!少一件都不行!

大家好&#xff0c;我是电商小V 最近很多新手小伙伴刚做店&#xff0c;操作抖音小店每天需要做的事情都是哪些呢&#xff1f;感觉自己一天很忙&#xff0c;但是也没有忙出来结果&#xff0c;思绪很乱&#xff0c;关于这个问题咱们今天就来详细的说一下&#xff0c;给你们梳理总…

02 贪吃蛇

前言 呵呵 这是不知道 在哪里看到的 别人做的一个贪吃蛇 因此 也把我 之前的 贪吃蛇 移植上来了 当然 这个不过是为了 简单的入门了解, 呵呵 然后 c版本的贪吃蛇 需要先移植成 c 版本, 然后 再根据 单片机相关 设计调整 比如 led 点阵的输出, 比如 c99 语法的一些不兼容…

12 c++版本的坦克大战

前言 呵呵 这大概是 大学里面的 c 贪吃蛇了吧 有一些 面向对象的理解, 但是不多 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 坦克大战 #include<iostream> #include<windows.h> #include<conio.h> #include<ctime> #include…

Python编程的终极十大工具

Python一直以来都是程序员们的首选编程语言之一&#xff0c;其灵活性和功能强大的库使其成为解决各种问题的理想选择。在本文中&#xff0c;我们将介绍Python编程的终极十大工具&#xff0c;这些工具可以帮助您在各种领域取得成功&#xff0c;无论您是初学者还是经验丰富的开发…

面试(四)

目录 1. 组长安排了一个不可能完成的任务&#xff0c;怎么拒绝&#xff1f; 2.讲一下Freertos的机器人 3. Freertos的中断 4. Freertos功能 5. 树莓派怎么识别二维码&#xff1f; 6. Linux脚本作用&#xff1f; 7. Modbus&#xff1f; 8. freertos的动态创建和静态创建…

【C++】C++的内存管理

目录 内存分布 动态内存管理 C语言的动态内存管理 C的动态内存管理 对内置类型操作 对自定义类型操作 new[]和delete[] 开空间的细节 探讨匹配问题 定位new表达式 内存分布 栈&#xff1a;存放非静态局部变量&#xff0c;函数参数&#xff0c;返回值等。栈是向下增长…

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(五)、小结

本次实验&#xff08;一&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天大学】实验&#xff1a;时序逻辑设计——三色灯开关&#xff08;一&#xff09;、实验指导书 本次实验&#xff08;二&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天…