当前位置: 首页 > news >正文

关于如何正确在测试用例中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());
}

相关文章:

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

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

深度学习0-前置知识

一、背景 AI最大&#xff0c;它的目的是通过让机器模仿人类进而超越人类&#xff1b; ML次之&#xff0c;它是AI的一个分支&#xff0c;是让机器模仿人类的一种方法。开发人员用大量数据和算法“训练”机器&#xff0c;让机器自行学会如何执行任务&#xff0c;它的成功取决于…...

web网页前后端交互方式

参考该文&#xff0c; 一、前端通过表单<form>向后端发送数据 前端是通过html中的<form>表单&#xff0c;设置method属性定义发送表单数据的方式是get还是post。 如使用get方式&#xff0c;则提交的数据会在url中显示&#xff1b;如使用post方式&#xff0c;提交…...

电商大数据的几种获取渠道分享!

在当今数字化时代&#xff0c;电商大数据已成为企业决策和运营的重要基础。如何高效地获取、分析和利用这些数据&#xff0c;对于提升电商企业的竞争力至关重要。本文将详细介绍几种电商大数据的获取渠道&#xff0c;帮助电商从业者更好地掌握数据资源&#xff0c;提升业务洞察…...

【图像配准】方法总结

图像配准(Image registration)就是将不同时间、不同传感器&#xff08;成像设备&#xff09;或不同条件下&#xff08;天候、照度、摄像位置和角度等&#xff09;获取的两幅或多幅图像进行匹配、叠加的过程&#xff0c;就是找到1幅图像像素到另1幅图像像素间的空间映射关系它已…...

SSM 超市管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…...

【Yonghong 企业日常问题04】永洪BI可视化工具Linux部署全攻略(部署详解版)

文章目录 一、准备工作二、服务器环境配置2.1 安装JDK2.2 安装字体 三、产品安装四、相关资料 一、准备工作 在进行部署之前需要有以下几项工作准备&#xff1a; 1.产品安装包 2.对应版本的License 3.对应版本的JDK(推荐JDK11&#xff0c;产品v8版本以上需要JDK11以上版本) 4.…...

ubuntu下gdb调试ROS

参考&#xff1a; 使用VsCode进行ROS程序调试_ros vscode 调试-CSDN博客 https://blog.csdn.net/weixin_45031801/article/details/134399664?spm1001.2014.3001.5506 一、调试准备 1.1 CMakeLists改动 注释文件中的 set(CMAKE_BUILD_TYPE "Release") #构建类…...

scala中正则表达式的使用

正则表达式&#xff1a; 基本概念 在 Scala 中&#xff0c;正则表达式是用于处理文本模式匹配的强大工具。它通过java.util.regex.Pattern和java.util.regex.Matcher这两个 Java 类来实现&#xff08;因为 Scala 运行在 Java 虚拟机上&#xff0c;可以无缝使用 Java 类库&…...

语音识别失败 chrome下获取浏览器录音功能,因为安全性问题,需要在localhost或127.0.0.1或https下才能获取权限

环境&#xff1a; Win10专业版 谷歌浏览器 版本 131.0.6778.140&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; 问题描述&#xff1a; 局域网web语音识别出现识别失败 chrome控制台出现下获取浏览器录音功能&#xff0c;因为安全性问题&#xff0c;需要在…...

前端本地数据存储方式有哪些

发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 在前端开发中&#xff0c;本地数据存储是实现客户端数据持久化的关键技术。以下是几种常见的前端本地数据存储方式&#xff1a; …...

python总说的cd是什么

以下适用于windows环境 cd就是change directory的缩写&#xff0c;即改变目录。 讲cd命令之前&#xff0c;先来看看提示符是什么意思。现在的提示符是c:\> c:说明现在的工作盘是c盘&#xff0c;\告诉我们当前的工作目录是根目录。 >的作用是把工作目录和我们要输入的…...

Mybatis加密解密查询操作(sql前),where要传入加密后的字段时遇到的问题

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;Mybatis加密解密查询操作&#xff08;sql前&#xff09;&#xff0c;where要传入加密后的字段时遇到的问题 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 例如…...

Netdevops入门基础学习03

1、数据类型 在Python中解释器会自动识别数据类型&#xff0c;但是在C语言中需要手动指定&#xff08;故Python简单易学&#xff09; 字符串&#xff1a; str&#xff08;string&#xff09; 在Python中加了引号的都是字符串整数&#xff1a; int (integer)浮点数&#xff1a; …...

什么是自然语言处理

01.什么是自然语言处理 自然语言处理(Natural Language Processing,简称NLP)是一门跨学科领域,它结合了计算机科学、人工智能、语言学、心理学等多个学科的知识,旨在使计算机能够理解、解释、处理和生成人类语言。自然语言处理的目标是缩小人类语言和计算机之间的差距,使…...

网络安全怎么学习

当我们谈论网络安全时&#xff0c;我们正在讨论的是保护我们的在线空间&#xff0c;这是我们所有人的共享责任。网络安全涉及保护我们的信息&#xff0c;防止被未经授权的人访问、披露、破坏或修改。 一、网络安全的基本概念 网络安全是一种保护&#xff1a;它涉及保护我们的设…...

网络多层的协议详述

网络层 1&#xff09;地址管理&#xff1a;制定一系列的规则&#xff0c;通过地址&#xff0c;在网络上描述出一个设备的位置 2&#xff09;路由选择&#xff1a;网络环境比较复杂&#xff0c;从一个节点到另一个节点&#xff0c;存在很多条不同的路径&#xff0c;需要规划出…...

【C#】方法参数的修饰符ref 与 out

在 C# 中&#xff0c;ref 和 out 是方法参数的修饰符&#xff0c;用于将参数 按引用传递&#xff0c;而不是按值传递。这允许方法修改调用者传递的变量的值。尽管它们的行为类似&#xff0c;但有重要的区别和适用场景。 1. ref 的含义与使用 含义 引用传递&#xff1a; 参数通…...

hpe服务器更新阵列卡firmware

背景 操作系统&#xff1a;RHEL7.8 hpe服务器经常出现硬盘断开&#xff0c;阵列卡重启问题&#xff0c;导致系统hang住。只能手动硬重启。 I/O error&#xff0c;dev sda smartpqi 0000:5c:00:0: resettiong scsi 1:1:0:1 smartpqi 0000:5c:00:0: reset of scsi 1:1:0:1:…...

arcgisPro相接多个面要素转出为完整独立线要素

1、使用【面转线】工具&#xff0c;并取消勾选“识别和存储面邻域信息”&#xff0c;如下&#xff1a; 2、得到的线要素&#xff0c;如下&#xff1a;...

【机器学习】【集成学习——决策树、随机森林】从零起步:掌握决策树、随机森林与GBDT的机器学习之旅

这里写目录标题 一、引言机器学习中集成学习的重要性 二、决策树 (Decision Tree)2.1 基本概念2.2 组成元素2.3 工作原理分裂准则 2.4 决策树的构建过程2.5 决策树的优缺点&#xff08;1&#xff09;决策树的优点&#xff08;2&#xff09;决策树的缺点&#xff08;3&#xff0…...

YOLOv8目标检测——详细记录使用ONNX Runtime进行推理部署C++/Python实现

概述 在之前博客中有介绍YOLOv8从环境安装到训练的完整过程&#xff0c;本节主要介绍ONNX Runtime的原理以及使用其进行推理加速&#xff0c;使用Python、C两种编程语言来实现。 https://blog.csdn.net/MariLN/article/details/143924548?spm1001.2014.3001.5501 1. ONNX Ru…...

联合物种分布模型(JSDM)与Hmsc包:群落生态学数据分析与预测技术

联合物种分布模型&#xff08;Joint Species Distribution Modelling&#xff0c;JSDM&#xff09;在生态学领域&#xff0c;特别是群落生态学中发展最为迅速&#xff0c;它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…...

蓝桥杯——竞赛省赛国赛题分享

目录 一.[蓝桥杯 2013 省 AB] 错误票据 代码如下&#xff1a; 二.[蓝桥杯 2024 省 Java B] 报数游戏 代码如下&#xff1a; 讲解&#xff1a; 三.[蓝桥杯 2014 国 C] 拼接平方数 代码如下&#xff1a; 四.三步问题&#xff08;递归&#xff0c;上台阶&#xff09; 代码…...

【ubuntu18.04】ubuntu18.04挂在硬盘出现 Wrong diagnostic page; asked for 1 got 8解决方案

错误日志 [ 8754.700227] usb 2-3: new full-speed USB device number 3 using xhci_hcd [ 8754.867389] usb 2-3: New USB device found, idVendor0e0f, idProduct0002, bcdDevice 1.00 [ 8754.867421] usb 2-3: New USB device strings: Mfr1, Product2, SerialNumber0 [ 87…...

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

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

如何在 Ubuntu 上安装 NodeBB 并使用 Nginx 反向代理

简介 NodeBB 是一款基于 Node.js 的开源论坛软件&#xff0c;为在线社区提供了现代化和响应式的解决方案。在 Ubuntu Linux 上运行的 NodeBB 利用了操作系统的强大性和灵活性&#xff0c;以提供高性能和可扩展性。它结合了 MongoDB 或 Redis 进行数据库管理&#xff0c;使其能…...

Linux脚本语言学习--下

4.Bash的变量 4.1.用户自定义变量 4.1.1.什么是变量 变量是计算机内存的单元&#xff0c;其中存放的值可以改变。当Shell脚本需要保存一些信息的时候&#xff0c;如一个文件名或是一个数字&#xff0c;就把他存放在一个变量中。每个变量有一个名字&#xff0c;所以很容易引用…...

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

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

React 第十七节 useMemo用法详解

概述 useMemo 是React 中的一个HOOK&#xff0c;用于根据依赖在每次渲染时候缓存计算结果&#xff1b; 大白话就是&#xff0c;只有依赖项发生变化时候&#xff0c;才会重新渲染为新计算的值&#xff0c;否则就还是取原来的值&#xff0c;有点类似 vue 中的 computed 计算属性…...

大模型呼入机器人系统如何建设?

大模型呼入机器人系统如何建设&#xff1f; 作者&#xff1a;开源呼叫中心系统 FreeIPCC, Github地址&#xff1a;https://github.com/lihaiya/freeipcc 大模型呼叫中心呼入机器人系统的建设是一个涉及多个环节和领域的综合性工程。以下是一个详细的步骤指南&#xff0c;涵盖了…...

【Java 学习】详细讲解---包和导包、Scanner类、输入源

1. 包 1.1 什么是包&#xff1f; 举个例子&#xff0c;你和你的同学有不同的家庭&#xff0c;你们都有自己的爸爸妈妈&#xff0c;都有自己的家。在自己的家中你们可以按照自己爱好摆放东西&#xff0c;都互不干扰。但是&#xff0c;假如你们的家都在一起&#xff0c;你们就不…...

java开发入门学习四-运算符

运算符 运算符&#xff1a; 运算法是一种特殊的符号&#xff0c;标识数据的运算&#xff0c;赋值等 根据分类 算数运算符 和前端运算法的方式是一致的&#xff0c;这里简单的描述% -- %: 取余 &#xff1a;增加 --&#xff1a; 减少 class Computed {public static voi…...

2009 ~ 2019 年 408【操作系统】大题解析

2009 年 讲解视频推荐&#xff1a;【BOK408真题讲解-2009年&#xff08;催更就退网版&#xff09;】 1. 同步与互斥&#xff08;7’&#xff09; 三个进程 P1, P2, P3 互斥使用一个包含 N&#xff08;N > 0&#xff09;个单元的缓冲区。P1 每次用 produce() 生成一个正整数…...

RestTemplate实时接收Chunked编码传输的HTTP Response

学习调用AI接口的时候&#xff0c;流式响应都是使用的 Transfer-Encoding: chunked&#xff0c;图方便想用RestTemplate&#xff0c;但是平时用到的都是直接返回响应对象的类型。使用bing搜索到一种方式&#xff0c;使用下面的代码来读取&#xff0c;于是掉这个坑里了&#xff…...

Java设计模式 —— 【结构型模式】适配器模式(类的适配器、对象适配器、接口适配器)详解

文章目录 基本介绍一、类的适配器二、对象适配器三、接口适配器总结 基本介绍 生活中有很多例子&#xff1a; 不同国家的插座接口不同&#xff0c;需要转换器&#xff1b;家用电源220V&#xff0c;手机只接受5V充电&#xff0c;需要转换器&#xff1b;读卡器&#xff0c;拓展…...

RabbitMQ 消息持久化/镜像队列/lazy对时延影响

测试背景&#xff1a; 不同条件下RabbitMQ不同队列类型的生产时延测试&#xff1a; 测试环境&#xff1a; 机型&#xff1a;rabbimtq.2u4g.cluster 背景流量&#xff1a;1000 TPS 测试条件&#xff1a; 消息大小 4k&#xff0c;消息条数为1000条&#xff0c;时延取值为平均…...

SQL在线格式化 - 加菲工具

SQL在线格式化 打开网站 加菲工具 选择“SQL 在线格式化” 或者直接访问 https://www.orcc.online/tools/sql 输入sql&#xff0c;点击上方的格式化按钮即可 输入框得到格式化后的sql结果...

【vue】在页面右下角添加悬浮按钮组件

效果图&#xff1a; 如上图所示&#xff0c;需要在页面的左下角添加一个悬浮按钮&#xff0c;鼠标放上去时候展示更多详细按钮&#xff0c;点击触发相应方法。 <div class"floating-component"><!-- 悬浮内容 --><el-tooltip placement"left&qu…...

MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势

目录 前言1. 探讨2. 基本知识3. 总结 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#x…...

C语言(指针练习2)

编写函数,要求用指针做形参&#xff0c;分别实现以下功能&#xff1a; &#xff08;1&#xff09;求一个字符串长度 &#xff08;2&#xff09;在一个字符 串中统计大写字母的个数 &#xff08;3&#xff09;在一个字符串中统计数字字符的个数 #include <stdio.h>int str…...

ES6学习Symbol(五)

这里写目录标题 一、概述二、代码 一、概述 ES6引入了一种新的原始数据类型Symbol&#xff0c;表示独一无二的值。 它是 JavaScript 语言的第七种数据类型&#xff0c;前六种是&#xff1a; undefined 、 null 、布尔值&#xff08;Boolean&#xff09;、字符串&#xff08;St…...

简易分页制作

简易分页功能实现 分页是一种常见的前端功能&#xff0c;特别是在需要展示大量数据时。它通过将数据分割成多个页面&#xff0c;帮助用户更容易浏览并提高页面加载性能。本文将介绍一个简易分页的实现思路及其代码实现&#xff0c;旨在帮助开发者快速理解并实现分页功能。 功…...

概率论得学习和整理27:关于离散的数组 随机变量数组的均值,方差的求法3种公式,思考和细节。

目录 1 例子1&#xff1a;最典型的&#xff0c;最简单的数组的均值&#xff0c;方差的求法 2 例子1的问题&#xff1a;例子1只是1个特例&#xff0c;而不是普遍情况。 2.1 例子1各种默认假设&#xff0c;导致了求均值和方差的特殊性&#xff0c;特别简单。 2.2 我觉得 加权…...

arXiv-2024 | NavAgent:基于多尺度城市街道视图融合的无人机视觉语言导航

作者&#xff1a;Youzhi Liu, Fanglong Yao*, Yuanchang Yue, Guangluan Xu, Xian Sun, Kun Fu 单位&#xff1a;中国科学院大学电子电气与通信工程学院&#xff0c;中国科学院空天信息创新研究院网络信息系统技术重点实验室 原文链接&#xff1a;NavAgent: Multi-scale Urba…...

WPF 布局控件

wpf 布局控件有很多&#xff0c;常用的有&#xff1a;Grid, UniformGrid, Border, StackPanel, WrapPanel, DockPanel。 1. Grid Grid 经常作为控件的 Content 使用&#xff0c;常作为 Windows, UserControl 等 UI 元素的根节点。它用来展示一个 n 行 n 列的排版。 因此就有…...

在Mac电脑上安装adb环境

当你在命令行输入 adb version 或adb devices, 报错&#xff1a;zsh: command not found: adb &#xff0c;那么说明你的 Mac 上没有安装 ADB&#xff08;Android Debug Bridge&#xff09;&#xff0c;或者它没有添加到你的路径中。你可以按照以下步骤安装和配置 ADB&#xff…...

方正畅享全媒体新闻采编系统 reportCenter.do SQL注入漏洞复现

0x01 产品简介 方正畅享全媒体新闻生产系统是以内容资产为核心的智能化融合媒体业务平台,融合了报、网、端、微、自媒体分发平台等全渠道内容。该平台由协调指挥调度、数据资源聚合、融合生产、全渠道发布、智能传播分析、融合考核等多个平台组成,贯穿新闻生产策、采、编、发…...

Linux SHELL脚本中的常用命令

一.设置主机名称 1.文件的方式 [rootlocalhost 桌面]# vim /etc/hostname [rootlocalhost 桌面]# cat /etc/hostname shell.aaa.org 修改完毕文件后在当前的shell中是不生效的 如果需要看到效果&#xff0c;关闭当前shell后重新开启新的shell 2.通过命令更改主机名 [rootl…...

Go语言启动独立进程

文章目录 问题解决方案1. **将 npc.exe 启动为独立的进程**2. **修改 exec.Command 函数**示例代码解释为什么这样有效注意 问题 在你当前的代码中&#xff0c;调用 exec.Command("XXX.exe") 启动 XXX.exe 程序时&#xff0c;这个程序是由 Go 程序直接启动的。如果 …...