关于如何正确在测试用例中mock静态方法的问题

文章目录

  • 情况一:希望在测试用例中直接执行静态方法的逻辑
  • 情况二:不希望在测试用例中执行静态方法的逻辑
    • 插桩方法
    • 坑1: 报错SubclassByteBuddyMockMaker
    • 原因与解决方案
    • 坑2:报错 the existing static mock registration must be deregistered
    • 原因与解决方案

关于如何正确在测试用例中mock 静态方法的问题

情况一:希望在测试用例中直接执行静态方法的逻辑

    // 比较简单,使用注解@Spy即可@Spyprivate DateUtils dateUtils;

情况二:不希望在测试用例中执行静态方法的逻辑

而是希望通过mock来模拟执行,比如静态方法中是关于某些客户端的操作,直接mock就行了。

插桩方法

 try (MockedStatic<FeiShuUtil> feiShuUtilMockedStatic = Mockito.mockStatic(FeiShuUtil.class)) {feiShuUtilMockedStatic.when(() -> FeiShuUtil.getFeiShuUsersByPhones(any(), any(), any())).thenReturn(List.of(new UserContactInfo()));// ActUrgentMessageSendDto sendDto = getUrgentMessageSendDto();ApiResultDto<String> result = messageSendService.sendUrgentPhoneMessage(sendDto);// AssertassertThat(result.getEr()).isEqualTo(ApiErrorCode.SERVER_ERROR.getCode());} // 这里静态模拟会被自动取消注册

坑1: 报错SubclassByteBuddyMockMaker

 			org.mockito.exceptions.base.MockitoException: The used MockMaker SubclassByteBuddyMockMaker does not support the creation of static mocksMockito's inline mock maker supports static mocks based on the Instrumentation API.You can simply enable this mock mode, by placing the 'mockito-inline' artifact where you are currently using 'mockito-core'.Note that Mockito's inline mock maker is not supported on Android.

原因与解决方案

原因:意味着当前使用的 Mockito 版本和配置不支持静态方法的模拟。这通常发生在使用较旧版本的 Mockito 或者没有正确设置以启用对静态方法模拟的支持时。

解决方法:添加依赖

   		<dependency><groupId>org.mockito</groupId><artifactId>mockito-inline</artifactId><version>3.12.4</version><scope>test</scope></dependency>

坑2:报错 the existing static mock registration must be deregistered

在执行单次测试用例的时候没有报错,但是一到集成测试,会测试一系列的测试用例,会有报错:

org.mockito.exceptions.base.MockitoException: 
For com.nimbus.messagecenter.util.FeiShuUtil, static mocking is already registered in the current threadTo create a new mock, the existing static mock registration must be deregistered

原因与解决方案

原因:插桩方法不对,,写法如下,没有通过try包起来

这个错误信息表明在当前线程中已经注册了一个针对 FeiShuUtil 类的静态方法的 Mockito 模拟(mock),并且您正尝试再次创建一个新的模拟,这违反了 Mockito 的规则。Mockito 不允许在同一线程中多次注册对同一类的静态方法的模拟。

当需要模拟静态方法时,通常会使用 Mockito.mockStatic() 方法来创建一个静态模拟。该调用返回一个 try-with-resources 语句或类似的作用域管理器,它会在作用域结束时自动取消注册静态模拟。如果您没有正确地关闭这个作用域,或者在一个测试方法中多次尝试创建静态模拟,就会遇到上述错误。

	MockedStatic<FeiShuUtil> feiShuUtilMockedStatic = Mockito.mockStatic(FeiShuUtil.class)feiShuUtilMockedStatic.when(() -> FeiShuUtil.getFeiShuUsersByPhones(any(), any(), any())).thenReturn(List.of(new UserContactInfo()));// ActUrgentMessageSendDto sendDto = getUrgentMessageSendDto();ApiResultDto<String> result = messageSendService.sendUrgentPhoneMessage(sendDto);// AssertassertThat(result.getEr()).isEqualTo(ApiErrorCode.SERVER_ERROR.getCode());
}

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

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

相关文章

Shell自定义(二)

1.Shell自定义 1.初始化 定义全局变量environ&#xff0c;把g_env的内容用memset初始化为0&#xff0c;这里用malloc开辟的空间为对应环境变量的长度1&#xff0c;多1位置是最后结束符0&#xff0c;strcpy把此时的对应的环境变量拷贝到g_env里面&#xff0c;下面是新增一个环…

PHPstudy中的数据库启动不了

法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql

安装与配置MongoDB 6.0以支持远程连接

安装与配置MongoDB 6.0以支持远程连接 目录 安装curl工具下载并导入MongoDB 6.0 PGP密钥向APT导入MongoDB 6.0版软件包的资源链接安装MongoDB依赖libssl1.1安装MongoDB启动并检查MongoDB服务状态进入MongoDB Shell交互式执行环境设置MongoDB开机自启配置MongoDB允许远程连接 …

Hive其一,简介、体系结构和内嵌模式、本地模式的安装

目录 一、Hive简介 二、体系结构 三、安装 1、内嵌模式 2、测试内嵌模式 3、本地模式--最常使用的模式 一、Hive简介 Hive 是一个框架&#xff0c;可以通过编写sql的方式&#xff0c;自动的编译为MR任务的一个工具。 在这个世界上&#xff0c;会写SQL的人远远大于会写ja…

百度智能云千帆AppBuilder升级,百度AI搜索组件上线,RAG支持无限容量向量存储!

百度智能云千帆 AppBuilder 发版升级&#xff01; 进一步降低开发门槛&#xff0c;落地大模型到应用的最后一公里。在千帆 AppBuilder 最新升级的 V1.1版本中&#xff0c;企业级 RAG 和 Agent 能力再度提升&#xff0c;同时组件生态与应用集成分发更加优化。 • 企业级 RAG&am…

解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误

解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误 您在 Ubuntu 20.04 上编译 OpenCV 3.2 时遇到的错误与 C 标准库的头文件配置问题有关。错误消息指出系统无法找到 <stdlib.h>&#xff0c;这通常与预编译头文件的处理、GCC 版本或者头文件搜索路径有关。下面…

Swagger自动文档工具以及gin-swagger的使用

什么是 Swagger&#xff1f; Swagger 是一个开源的 API 设计和文档工具&#xff0c;旨在帮助开发者更高效地设计、构建、记录和测试 RESTful API。它基于 OpenAPI 规范&#xff08;前身为 Swagger 规范&#xff09;&#xff0c;通过自动化的方式生成交互式 API 文档、客户端 S…

网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&am…

为什么要用单例模式?

‌单例模式是一种创建型设计模式&#xff0c;用于确保某个类只有一个实例&#xff0c;并提供一个全局访问点&#xff0c;使得其他类可以轻松访问该实例‌。 使用单例模式的主要原因包括以下几点&#xff1a;‌ ‌确保唯一性‌&#xff1a;在某些情况下&#xff0c;我们需要确…

c语言——数据结构【链表:单向链表】

上篇→快速掌握C语言——数据结构【创建顺序表】多文件编译-CSDN博客 一、链表 二、单向链表 2.1 概念 2.2 单向链表的组成 2.3 单向链表节点的结构体原型 //类型重定义,表示存放的数据类型 typedef int DataType;//定义节点的结构体类型 typedef struct node {union{int l…

在Linux中使用`scp`进行远程目录文件复制

在Linux系统中&#xff0c;scp&#xff08;安全复制协议&#xff09;是一个使用SSH&#xff08;安全外壳协议&#xff09;进行文件和目录安全传输的命令。它允许在远程主机之间复制文件和目录&#xff0c;具有很强的安全性&#xff0c;是一种常用的文件传输工具。以下是如何使用…

【AI图像生成网站Golang】项目测试与优化

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与优化 六、项目测试与优化 在开发过程中&#xff0c;性能优化是保证项目可扩展性和用户体验的关键步骤。本文将详细介绍我如何使用一…

Mybatis映射关系

目录 多对一 方式一&#xff1a;一条sql语句&#xff08;级连属性映射&#xff09; 方式二&#xff1a;一条sql语句&#xff08;association&#xff09; 方式三&#xff1a;两条sql语句&#xff0c;分步查询 一对多 方式一&#xff1a;collection 方式二&#xff1a;分…

单片机:实现计数器(附带源码)

一、单片机计数器功能概述 单片机中的计数器一般是由硬件定时器模块实现的&#xff0c;计数器可以被配置为不同的模式&#xff0c;例如&#xff1a; 普通计数模式&#xff1a;计数器从零开始增加&#xff0c;直到某个最大值后清零或中断。事件计数模式&#xff1a;计数器根据…

隐私清理工具Goversoft Privazer

PrivaZer 是一款专为隐私保护而生的 Windows 系统清理工具&#xff0c;支持深度扫描、清除无用文件和隐私痕迹。 PrivaZer - 深度扫描磁盘&#xff0c;自动清理上网痕迹&#xff0c;全面保护 Windows 的网络隐私 释放磁盘空间 硬盘空间告急&#xff0c;想清理却又无从下手&…

基于Spring Boot的医院质控上报系统

一、系统背景与意义 医院质控上报系统旨在通过信息化手段&#xff0c;实现医院质量控制的标准化、流程化和自动化管理。该系统能够帮助医院实时监控医疗质量数据&#xff0c;及时发现和处理潜在的质量问题&#xff0c;从而确保医疗服务的安全性和有效性。同时&#xff0c;系统…

Java-30 深入浅出 Spring - IoC 基础 启动IoC 纯XML启动 Bean、DI注入

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

Python-基于Pygame的小游戏(坦克大战-1.0(世界))(一)

前言:创作背景-《坦克大战》是一款经典的平面射击游戏&#xff0c;最初由日本游戏公司南梦宫于1985年在任天堂FC平台上推出。游戏的主题围绕坦克战斗&#xff0c;玩家的任务是保卫自己的基地&#xff0c;同时摧毁所有敌人的坦克。游戏中有多种地形和敌人类型&#xff0c;玩家可…

多核并发编译引起的编译错误

编译某个模型的工程化代码&#xff0c;模型里有多个算子使用了tensorrt plugin方式实现的&#xff0c;编译时总是报插件相关的目标文件找不到: CMake Error at /opt/conda/share/cmake-3.22/Modules/FindCUDA/make2cmake.cmake:48 (file):file failed to open for reading (No…

【达梦数据库】Coredump文件生成与分析

目录 背景参考链接分析Coredump文件获取问题SQL1、查看Coredump文件生成路径2、使用gdb工具读取Coredump文件3、记录崩溃线程堆栈4、记录当前崩溃线程号5、使用dmrdc工具分析Coredump文件6、寻找线程号对应SQL7、重新执行SQL&#xff0c;复现问题 记录Coredump文件中所有线程的…