PowerMock的使用

embedded/2025/3/15 10:44:13/

1. mock私有方法

待测试类

public class Demo {public void publicMethod() {System.out.println("public method invoke");protectedMethod("str");privateMethodA();privateMethodB();System.out.println("public method end");}protected void protectedMethod(String str) {System.out.println("protected method invoke");System.out.println("protected method end");}private void privateMethodA() {System.out.println("private methodA invoke");System.out.println("private methodA end");}private String privateMethodB() {System.out.println("private methodB invoke");System.out.println("private methodB end");return "privateMethodB";}
}

测试类

import com.lianlian.cbfin.credit.mng.controller.Demo;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;import static org.mockito.Matchers.any;@RunWith(PowerMockRunner.class)
@PrepareForTest({Demo.class}) // 需要mock私有方法的类,必须要加这个!!!否则mock不生效且有一些奇奇怪怪的问题
public class DemoTest {private Demo demo;@Beforepublic void init() throws Exception {demo = PowerMockito.spy(new Demo()); // spy:demo对象的方法会被真实调用,除非指定mock了一些内容,例如下面被mock的方法
//        demo = PowerMockito.mock(Demo.class); // mock:demo对象的方法都会被mock,不会真实调用PowerMockito.doNothing().when(demo, "protectedMethod", any());PowerMockito.doNothing().when(demo, "privateMethodA");PowerMockito.doReturn("123").when(demo, "privateMethodB");}@Testpublic void publicMethod(){demo.publicMethod();}
}

运行结果

public method invoke
public method end

2. mock静态方法

待测试类

public class Demo {public void demoMethod() {System.out.println("demo method invoke");privateStaticMethod();StaticClass.publicStatic();System.out.println("demo method end");}private static String privateStaticMethod(){System.err.println("privateStatic method invoke");return null;}
}

静态方法提供类

public class StaticClass {public static void publicStatic(){System.out.println("publicStatic method invoke");}
}

测试类-未正确mock


import com.lianlian.cbfin.credit.mng.controller.Demo;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.modules.junit4.PowerMockRunner;@RunWith(PowerMockRunner.class)
public class DemoTest {private Demo demo;@Beforepublic void init() throws Exception {demo = PowerMockito.spy(new Demo());}@Testpublic void demoMethod(){demo.demoMethod();}
}

mock前运行结果

demo method invoke
privateStatic method invoke
publicStatic method invoke
demo method end

测试类-正确mock

import com.lianlian.cbfin.credit.mng.controller.Demo;
import com.lianlian.cbfin.credit.mng.controller.StaticClass;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;@RunWith(PowerMockRunner.class)
@PrepareForTest({Demo.class, StaticClass.class}) // 需要mock静态方法的类;这个@PrepareForTest可以当作Mockito的增强版,需要mock私有方法或者静态方法,就加上这个注解
public class DemoTest {private Demo demo;@Beforepublic void init() throws Exception {demo = PowerMockito.spy(new Demo());}@Testpublic void demoMethod() throws Exception {PowerMockito.mockStatic(StaticClass.class);PowerMockito.mockStatic(Demo.class);PowerMockito.when(Demo.class, "privateStaticMethod").thenReturn("mock privateStaticMethod"); // 私有静态方法正确的mock方法;私有静态方法也是静态方法
//        PowerMockito.doReturn("mock privateStaticMethod").when(demo, "privateStaticMethod"); // 私有静态方法错误的mock方法,不能当成私有方法mockdemo.demoMethod();}
}

正确mock后运行结果

demo method invoke
demo method end
文章来源:https://blog.csdn.net/m0_46836425/article/details/146261506
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/embedded/172740.html

相关文章

基于RTTR在C++中实现结构体数据的多层级动态读写

文章目录 1.背景2.RTTR2.1.注册结构体2.2.实现读操作2.3.实现写操作 3.读写调用例程4.结语 1.背景 目前有个项目,同一台电脑上的codesys程序将其结构体数据通过共享内存的方式写道了一个“共享内存”上。 我在取得内存数据后,需要对这个数据进行结构体的…

第13章贪心算法

贪心算法 局部最优求得总体最优 适用于桌上有6张纸币,面额为100 100 50 50 50 10,问怎么能拿走3张纸币,总面额最大?—拿单位价值最高的 只关注局部最优----关注拿一张的最大值拆解-----拿三次最大的纸币 不适用于桌面三件物品&am…

Linux常用命令速查手册

Linux常用命令速查手册 Linux常用命令速查手册1. 文件和目录操作1.1 查看当前目录(pwd)1.2 切换目录(cd)1.3 列出目录内容(ls)1.4 创建目录(mkdir)1.5 删除文件和目录(rm…

xlua 运行原理

iOS限制App的二进制代码要一次性的包含在App内,也就是AOT,不支持JITLua代码作为资源文件,玩家下载,不涉及字节码,所以可以做热更Lua代码通过Lua虚拟机解释执行(解释成机器码),并在虚…

小语言模型(SLM)技术解析:如何在有限资源下实现高效AI推理

引言:为什么小语言模型(SLM)是2025年的技术焦点? 2025年,人工智能领域正经历一场“由大变小”的革命。尽管大语言模型(LLM)如GPT-4、Gemini Ultra等在复杂任务中表现惊艳,但其高昂的…

泛目录效果:提升网站SEO与用户体验的关键策略

泛目录效果:提升网站SEO与用户体验的关键策略 在当今数字化时代,网站优化(SEO)已成为企业提升在线可见性和吸引流量的重要手段。其中,泛目录效果作为一种有效的SEO策略,不仅能够提升搜索引擎排名&#xff…

【6】拓扑排序学习笔记

前言 有向无环图和拓扑排序直接关联到中后期的图论建模思想,是很重要的基础知识。这个如果不彻底弄懂,以后图论会很困难。 有向无环图 正如其名,一个边有向,没有环的图,也叫DAG。 DAG图实际运用:描述含…

STM32项目分享:STM32智能窗户

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: STM32智能窗户 (资料分享见文末&…