java单元测试Mockito、PowerMockito相关整理

Powermockito之static方法的Mock和Spy 写Junit,当遇到数据库调用,文件操作等耗时的方法,或者接口不可用的时候,通常需要mock或者spy这个方法的调用。 Powermockto的强大之处,在于它可以应用于静态,私有等方法。 下面讲解一下这两种方式如何应用于Static方法。 Mock Static Junit最常用的方式就是Mock,mock会导致所有的静态方法都被stub,导致方法默认返回null(对象),0(数字)或者fals... 阅读详情
  • 引入的依赖
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version> <!-- 版本号根据实际需要选择 -->
    <scope>test</scope> <!-- 作用范围为测试阶段 -->
</dependency>

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.11.2</version> <!-- 版本号根据实际需要选择 -->
    <scope>test</scope> <!-- 作用范围为测试阶段 -->
</dependency>
  • 基础的操作

在需要写的项目中看下有没有对应的目录:在src目录下面有没有test/java和test/resource的文件夹,没有手动创建下就好了

1.以idea创建测试类为例,在你需要写的则试类的类里面按住快捷键: alt+Insert, 就会出现一个Test...选项, 选中就会出现一个窗口, Testting Library一般选择JUnit4即可;

Generate这里根据自己的需要勾选setUp/@Before这个我们比较常用;

最后再把所有需要写的方法勾选,点击0K就好了

2.在创建好的测试类上面加入注解: @Runwith(PowerMockRunner.class)

3.在测试类中写入需要将目标类mock下:

例如目标类为A类,则需要写成下面的代码:

@InjectMocks

private A a;

4.目标类中应该会有一些oc容器的对象,通过aRes ouc e或@Autowir ed主解获取,那需要将这些都要放入到测试类中

例如目标A类中引入了b和c两个对象,原代码如下:

@Autowired

private B b;

@Resource

private C c;

测试类的代码则需要写成

@Mock

private B b;

@Mock

private C C;

  • 对于方法中new的对象怎么mock

先加个@PrepareForTest({TestTarget.class}) TestTarget 是测试的类名

然后写入下面的代码

@Before

public void setUp(){

      MockitoAnnotations.initMocks(this);

}

最后根据情况 mock

//方法中的 new 的一个有参实体类
TargetClazz clazz = new TargetClazz("111",111,...);

//写成下面的代码
TargetClazz clazz = Powermockito.mock(TargetClazz.class);
PowerMockito.whenNew(clazz.class).withAnyArguments().thenReturn(clazz);
//方法中的 new 的一个无参实体类
TargetClazz clazz = new TargetClazz();

//写成下面的代码
TargetClazz clazz = Powermockito.mock(TargetClazz.class);
PowerMockito.whenNew(clazz.class).withNoArguments().thenReturn(clazz);
  • 对于目标类中有私有的对象怎么 mock

通过@Value 注解获取值的

@Value("${test.status}")

private String status;

//需要在测试类中写入以下代码
ReflectionTestUtils.setField(impl,"status","1");

//impl是测试目标类,写在了测试类中
@InjectMocks
private TestImpl impl;

//第二个参数就是目标类中的参数名称
//第三个参数就是对应的值,这个值跟参数的类型有关,值可以随便写

只是单纯的字段,怎么 mock?

private String status;

通过反射去获取字段的属性
1.当前测试的类:TargetClazz


TargetClazz clazz = new TargetClazz();

TargetClazz spy = Mockito.spy(clazz);

Field statusField = TargetClazz..class.getDeclaredField("status");

FieldSetter.setField(spy,statusField,"1");
  • 如果这个参数是写在目标类里面,作为一个私有参数并且new一个对象出来怎么 mock
//目标代码的参数:
private final Map map = new HashMap;

//可以写成下面的代码
private Map mp:

@Before
public void setUp(){
    map = PowerMockito.mock(HashMap.Class);
    Whitebox.setInternalState(controller, "map", map) ;
}
  • 对于静态方法怎么mock
//原代码如下:
final String originPassword = SHATools.decryptPwdStr(pwd, cryptSuffix):
测试类操作:
1.在测试类上面加注解PrepareForTest
@PrepareForTest({SHAToo1s.class}),一个不需要加{},多个的话,以,隔开
2.添加下面的代码在你的测试类的方法里面
PowerMockito.mockStatic(SHATools.class);
你也可以在@Before注解的方法里面加,这样一个测试类只需要写一次了,要不然每个调用的方法
里面有这个的话,都需要在对应的测试类的方法里面写上这个代码
@Before
public void setUp(
    MockitoAnnotations.initMocks(this);
    PowerMockito.mockStatic(SHATools.class);
}
3.然后就可以根据返回写代码了
Mockito.mock(SHATools.decryptPwdStr(Mockito.anyString(), Mockito.anyString())). thenReturn("任务字符串")
注:首先要确定好里面的参数类型,不确定可以写Mockito.any(),但是一定要保证参数是有值的,
如果是null的话,你的返回没有用,thenReturn这个是根据你的返回值类型来的,案例返回的是一个
string类型的,所以随便返回个字符串即可。
如果你原代码中的参数就是有个nul1,例如:
final String originPassword = SHATools.decryptPudStr(null, cryptSuff1x);
那测试类就需要将aryptSuffix的值确定好
Mockito.mock(SHAToo1s.decryptPwdStr(null, cryptSuffix)),thenReturn("任意字符串");
  • 单元测试有异常怎么 mock
如果是异常,先确定是哪个代码引起的异常,可以将原代码那块异常的换成其他异常,看看报错的位置
(1)原代码报错的异常是没有返回的
public ServletOutputStream downloadById(servletoutputStream outputStream){

    InputStrean nputStream = ...;
    try{
        final byte[] buffer = new byte[BUFFER SIZE];
        int len = 0;
        while(inputSteam.available()>0){
            len =inputStream.read(buffer);
            outputStream.write(buffer, 0, len);
        }
        return outputStream;
    } catch (IOException e){
        log.error("downloadById异常,异常原因:",e);
    }
    return outputStream;
}
此处有个IOException异常,找一个个我们mock的对象,进行mock返回异常,outputStream就是一个mock的对象
ServletOutputStream outputStream = Mockito.mock(ServletOutputStream.class);
IOException ioException = Mockito.mock(IOException.class);
Mockito.doThrow(ioExcentson).when(outputstream).write(Mockito.any(),Mockito.anyint(),Mockito.anyInt());
try{
    impl.downloadEyId(outputStream);
}catch (IOException e){

}
注:需要注意的是,如果在原代码里面没有throw一个异常的话,测试类的代码是不需要try catch的
(2)原代码报错的异常是有返回的
try{
    final String originPassword = SHATools.decryptPwdstr(pwd, cryptSuffix);
    final String encodePassword = SHAToo1s.SHA(originpassword, SHATao1s.SHA512);
} catch (final NoSuchAlgorithmException e)
    throw new BusinessException(UserExceptionEnum.PWD_DECODE_ERROR) ;
} catch (final UnsupportedEncodingException e) {
    throw new BusinessException(UserExceptionEnum. PWD_DECODE_ERROR) ;
}

此处这种代码是一个工具类,方法是static修饰的静态方法,且有两个异常,我们代码中需要怎么让他们全部走完
    SHATools.SHA -> NoSuchAlgorithmException
    SHATools.decryptPwdStr -> UnsupportedEncodingExceptjon
这是它们的异常关系,看代码顺序SHATools.decryptPwdstr这个在SHATools.SHA前,所以我们需要先走SHATools.SHA这个方法的异常,然后再走SHATools.decryptPwdStr的异常
接下来就是代码:
NoSuchAlgorithmException noSuchAlgonithmException = Mockito.mock(NoSuchAlgorithmException.class);
Mockito.when(SHATools.SHA(Mockito.anyString(),Mockito.anyString())).thenThrow(noSucnoSuchAlgonithmException);
try {
    impl.test("111","111","111111","111");
}catch (BusinessException e){

}

UnsupportedEncodingException exception = Mockito.mock(UnsupportedEncodingException.class);
Mockito.when(SHATools.decryptPwdSer(Mockito.anyString(), Mockito.anyString())). thenThrow(exception);
try {
    impl.test("111","111","111111","111");
}catch (BusinessException e){

}


由于原代码是有throw new BusinessException,所以我们则试类的代码机取是需要抓取这个BusinessException异常的,不抓取处理的话会有报错。

注:异常的是处理是写在原有正常的代码走完的情况下再去操作的

注:万物皆可mock(除了抽象类)

2024年Java单元测试实战:TestNG与PowerMock处理复杂遗留代码 单元测试是保障软件质量的核心实践,其核心原理是通过隔离被测代码的依赖,验证逻辑单元行为的正确性。在Java生态中,JUnit和Mockito是主流的测试框架与Mock工具,但在处理遗留系统或设计不佳的代码时,常会遇到静态方法、final类等“不可测试”的障碍。TestNG框架通过提供依赖测试、分组测试和参数化测试等高级特性,弥补了JUnit在复杂测试场景编排上的不足。而PowerMock则通过字节码操作技术,突破了传统Mock框架的限制,能够模拟静态方法、构造方法等硬依赖,为解决历史遗留代码的测试覆盖提供了 阅读详情

相关推荐

【Java】使用PowerMockito mock static方法/new对象/mock对象的public或private方法的简单示例

PowerMockito简单实战,帮助编写测试用例。

自然 1万+

PowerMock使用-Spy公共方法

本篇文章将说明如何使用PowerMock对公共方法进行Spy。

用朴素的话说技术。 3946

周立功CAN盒二次开发实录:用QT5.1.0解析汽车CAN报文(附数据可视化技巧)

本文详细介绍了基于QT5.1.0和周立功USBCAN-E-U设备进行汽车CAN总线二次开发的实战过程。核心内容包括利用CANdb++数据库解析原始报文并转换为物理值,以及通过QCustomPlot库实现高性能实时数据可视化,为车载诊断与车联网开发提供了一套完整的工程实践方案。

sugar的博客 1059

单元测试之Power Mock

一、简介 EasyMock、Mockito、jMock(单元测试模拟框架) 在有这些模拟框架之前,程序员为了编写某一个函数的单元测试,必须进行十分繁琐的初始化工作,以确保调用的接口或编写的代码得到预期的结果。单元测试模拟框架极大的简化了单元测试的编写过程,在被测试代码需要调用某些接口的时候,直接模拟一个假的接口,并任意指定该接口的行为。这样就可以大大的提高单元测试的效率以及单元测试代码的可读性。 **缺点:**都不可以实现对静态函数、构造函数、私有函数、Final函数以及系统函数的模拟,但是这些方法往往是

weixin_43771403的博客 4118

python指纹识别算法(亲测代码可用)

python指纹识别算法

2301_76482796的博客 3080

LPDDR6 技术标准详解(JESD209-6)

是继 LPDDR5/5X 之后的新一代低功耗 DRAM 标准,专为满足移动终端、AI、边缘计算等高带宽、低功耗场景而设计。该标准通过全新架构、动态功耗控制机制和增强型数据完整性机制,实现性能、能效与可靠性的全面升级。LPDDR6 并非仅是速度升级,更是内存架构设计思路的演进,围绕“低功耗 + 高带宽 + 强安全”的三维目标,构建下一代 SoC 平台关键基础。✅ 高带宽:支持 32B/64B 动态突发✅ 低功耗:动态电压、通道切换✅ 高可靠性:ECC + 自测试 + 安全区。

weixin_43199439的博客 2592

利用PowerMockito单测

PowerMock的用途 PowerMock主要是用于在单测中Mock类,方法。隔绝外部的依赖,注重自己代码的逻辑的工具。 对比Mockito的优势在于可以mock静态类,私有方法 maven依赖 现有代码中使用依赖如下,后续会根据实际情况增减。 <!-- junit包 --> <dependency> <groupId>junit</groupId> <artifactId>juni

智障少年木易 2284

yolov26改进 | 融合改进篇 | 轻量级移动端网络ShuffleNetV2融合CCFM参数量仅百万(附代码+修改教程)

本文介绍ShuffleNetV2与跨尺度特征融合模块CCFM融合改进的YOLOv26。ShuffleNetV2以硬件效率为导向,通过通道分割、轻量卷积和Channel Shuffle减少冗余计算与内存访问,在降低参数量和GFLOPs的同时保持高效特征提取;CCFM进一步加强不同尺度特征交互,弥补轻量主干语义表达不足的问题。本人在轻量模型上测试后,参数量和计算量明显下降,检测精度有一定提升,适合移动端、边缘设备及实时检测任务。文中提供完整代码、配置文件、模块注册及Codex修改思路,方便复现、对比和二次创新。

Snu77的博客 203

PowerMock使用-Spy静态方法

本篇文章将说明如何使用PowerMock对静态方法进行Spy。

用朴素的话说技术。 1274

高通camx hal进程dump日志分析四:Node DumpDebugInfo原理分析

摘要: 本文讲解了高通Camx架构中DumpDebugInfo的原理,重点分析了Node组件的DumpDebugInfo()方法。该方法会输出Node自身调试信息,并调用DumpFenceErrors()接口输出Fence错误信息。具体包括:检查请求队列状态、输出未完成请求的元数据/完成状态/未处理Fence数量等关键信息,以及Fence错误原因(如延迟、未触发、结果失败等)。通过代码注释详细解析了各字段含义,为后续分析Dump异常日志提供理论基础。

787

【即插即用模块】Transformer篇 | TCSVT 2025 | DAFM:双注意力聚合+反向跨模态筛选,特征精准捕捉并融合!

本文提出了一种双模态注意力融合模块(DAFM),用于增强多模态图像融合任务中的特征交互。该模块通过双注意力聚合机制,结合自注意力与跨模态注意力,有效提升特征融合效果。DAFM采用可学习平衡因子动态调整注意力权重,并运用深度卷积降低计算复杂度。实验结果表明,该模块能显著提升多模态图像融合质量,适用于RGB-红外等双模态视觉任务。模块代码实现简洁,可直接集成到现有网络中作为特征融合层使用。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 177

mockito与powerMock用法汇总

前言 上次整理了单测的学习笔记,所以这次就对java常见的两个单测工具包(mockito、powerMock)进行学习了解,总结一些常见的用法 mockito 1.mock 对象 Person xiaoHong = new Person(); Person xiaoMing = Mockito.mock(Person.class); xiaoMing 被加上了一层动态代理 MockMethodInterceptor 2.mock bean 并注入到测试类 使用 @RunWith(MockitoJUni

Samzhu 2865

YOLO11训练中的过拟合识别与应对策略:讲解过拟合的表现、原因及应对方法(如数据增强、正则化、DropOut)

摘要 本文深入探讨了YOLO11目标检测模型中的过拟合问题。首先解析了过拟合的本质,即模型在训练数据上表现优异但泛化能力差的现象,并通过误差分解公式解释了其数学原理。文章详细列举了YOLO11中过拟合的具体表现,包括训练与验证指标分化、检测性能不一致性、置信度分布异常和类别检测不均衡等问题,并提供了对应的可视化诊断方法。 在原因分析部分,重点阐述了模型复杂度与数据规模不匹配、训练数据质量与分布问题以及训练策略不当三大根本原因。特别对比了YOLO11不同版本(n/s/m/l/x)的参数量和推荐最小数据量,指出

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 247

PowerMock 使用spy注解来解决类中方法之间调用的mock问题

A方法调用B方法时如何mock mockio.spy解决方法调用的mock问题

lixia0417mul2的博客 2048

把复杂计算推到数据库里:ABAP CDS View Table Function 从原理到落地实践

摘要:本文深入解析ABAP CDS Table Function技术,重点探讨其在复杂业务场景下的应用价值。当CDS View无法满足窗口函数、递归计算等高级需求时,Table Function通过结合CDS类型系统与AMDP的数据库原生计算能力,成为关键解决方案。文章详细介绍了Table Function的架构设计(CDS实体声明+AMDP实现)、客户端处理机制、开发传输流程中的注意事项,并通过航班数据示例展示最小实现闭环。这项技术特别适用于需要将复杂计算下推到数据库层的场景,能显著提升RAP和OData

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2303

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java通过PowerMockito和Mokito进行单元测试

是Mockito的扩展,它允许您在测试中执行更多的操作,如模拟静态和私有方法,模拟构造函数,甚至在单个测试中模拟静态和普通方法的混合调用。PowerMockito和Mockito都是Java测试框架,用于模拟对象和方法,其中PowerMockito可以模拟一些无法使用Mockito单独模拟的场景,例如静态方法、私有方法等。它允许你模拟对象,在测试中隔离被测代码的依赖项。总之,Mockito是一个基于模拟的测试框架,而PowerMockito是Mockito的扩展,允许您在测试中模拟更多的Java类和库。

学渣的博客 2589

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Junit+PowerMockito 使用指南

简介JUnit 是 Java 应用程序中使用最广泛的测试框架之一。PowerMockito 是 Mockito 的一个扩展,它提供了对 Mockito 无法处理的类的模拟,比如静态方法、私有方法、构造函数和 final 类。环境准备1. 首先,确保在项目中添加了 JUnit 和 PowerMockito 的依赖。以下是 Maven 依赖配置示例:<dependency>   <g...

技术原始积累 808

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

Powermock使用笔记

powermock使用 mock与spy 的区别 语法的区别: Test ms = PowerMockito.mock(Test.class); Test ms = PowerMockito.spy(new Test()); Mock对象的区别: mock方法生成的对象为一个空对象,即里面所有的方法均被mock了,所以在调用该对象里面的方法 时候,均不会执行该方法,仅会返回方法返回值的零值。 spy方法生成的对象是一个真实的对象,即调用该对象里面的方法时,会实际执行方法中的内容。 使用场景的区别: mo

qq_28112995的博客 2068

PowerMockito之测试私有方法

类名 fixture = new 类名(); @Test public void testCheckLockKeyTimeout() throws Exception { 类名 spy = PowerMockito.spy(fixture); Method checkLockKeyTimeout = PowerMockito.method(类名.class...

weixin_42345739的博客 5368

powermockito测试私有方法

为什么要写单元测试?单元测试可以减少bug率,提升代码的质量,还可以通过单元测试来熟悉业务;有些公司可能还会强制要求,每次新增代码、或者变更代码单测覆盖率要达到多少比例才能申请代码合并。

qq_35932990的博客 3326

PowerMockito,Mockito spy private方法

mock中测试private方法,不是mock: Method method = PowerMockito.method(CategoryController.class, "getCategory",List.class);//创建调用CategoryController类中的getCategory私有方法的method对象,参数是list对象 List<Category> ca...

fei33423的专栏 9844

PowerMock spy基本使用

【代码】PowerMock spy基本使用。

JAVA老司机,热爱代码,技术卓绝。 285

PowerMock 入门(*)

单元测试

weixin_42408447的博客 2221

powermock私有方法要先spy

https://blog.51cto.com/u_15009374/3145673 @Test public void testStudentPrivateService(){ StudentPrivateService studentPrivateService = PowerMockito.spy(new StudentPrivateService()); try { PowerMockito.doAnswer(new

weixin_41431802的博客 459

013-Java单元测试之PowerMock

EasyMock 以及 Mockito 都因为可以极大地简化单元测试的书写过程而被许多人应用在自己的工作中,但是这 2 种 Mock 工具都不可以实现对静态函数、构造函数、私有函数、Final 函数以及系统函数的模拟,但是这些方法往往是我们在大型系统中需要的功能。PowerMock 是在 EasyMock 以及 Mockito 基础上的扩展,通过定制类加载器等技术,PowerMock 实现了之前提到的所有模拟功能,使其成为大型系统上单元测试中的必备工具。

mythsmyths的博客 1371

Java单元测试实战(一)基础

一般地,单元测试是针对一个类的一个公有方法的测试。PowerMock 是一个扩展了其它如EasyMock 等mock 框架的、功能更加强大的框架。PowerMock 使用一个自定义类加载器和字节码操作来模拟静态方法、构造方法、final 类和方法、私有方法、去除静态初始化器等等。

qq_36188127的博客 1286
上一篇: logback.xml相关配置——springboot项目
要变得更懂'你'
博客等级 码龄9年 9粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值