PowerMock使用问题及方案个人总结帖

2023-05-16

最近一直有使用PowerMock进行测试。很方便,但是当待测试方法的调用情况比较复杂的时候,往往不知道怎么处理。在这里把自己的解决方法整理一下做个备份。
直接以问题-解决方法的方式。

1.PowerMock mock 静态方法

mock静态方法,需要提前打上** @RunWith @PrepareForTest注解,@PrepareForTest**这个注解可用于类和方法。

关于** @RunWith @PrepareForTest**的使用场景,个人理解就是比较复杂的情形,比如mock私有方法,静态方法,mock在方法内部new的对象,final方法。

有了这两个注解,在mock静态方法之前,还需要使用** PowerMockito.mockStatic(YourStaticClass.class);**,之后就可以对该类的静态方法进行mock或者别的操作了。代码如下:

@RunWith(PowerMockRunner.class)
@PrepareForTest(YourStaticClass.class)
public class XXXTest {
    @Test
    public void test() {
     	PowerMockito.mockStatic(YourStaticClass.class);
     	when(YourStaticClass.staticMethod(something)).thenReturn(something);
     	// 待测试逻辑
    }
}

2.PowerMock mock 枚举类的方法

这个的情况是这样子,有个枚举A,如下

public enum NameEnum {

    ZHANGSAN("张三") {
        @Override
        public boolean getName() {
           return this.name;
        }
    };

    private String name;

    WhiteListEnum(String name) {
        this.name = name;
    }

    public abstract String getName();

}

待测试方法中调用了NameEnum.ZHAGNSAN.getName();,现在要抑制这个方法。做法如下:

@RunWith(PowerMockRunner.class)
@PrepareForTest(
        value = {NameEnum.class},
        fullyQualifiedNames = {
                "com.xx.NameEnum$1"
        }
)
public class XXTest {

	@Test
    public void test() {
	   	// 替换NameEnum.ZHANGSAN的getName方法 这里使用getDeclaredMethods()获取数组,再获取方法,
	   	// 是经过测试,直接使用方法名获取方法,会报NoSuchMethod,才疏学浅,只好这么用
        Method getName= NameEnum.ZHANGSAN.getClass().getDeclaredMethods()[0];
        // with里面传入一个新的InvocationHandler实现,powermock将会使用这个实现替换原有方法
        PowerMockito.replace(getName).with((proxy, method, args) -> "李四");
        // 你的测试逻辑
    }
}

整个的思路就是将枚举类中的方法替换为新的实现,在**@PrepareForTest注解中,需要指定全限定名,注意$1**,是为了取出枚举的第一个枚举量。
在获取待替换Method的时候, 也可以用PowerMockito的method方法,但是我这种情形,如果使用PowerMockito的method方法,会找到两个getName方法,抛异常。可能是由于枚举的原因,我不清楚,下面的父类调用的情形,可以用这个方式获取Method。

3.PowerMock mock 父类方法调用

我的情况是待测试方法中调用了本类的私有方法,在本类私有方法中调用了父类的公共方法。简单用代码模拟一下

public class Father{
	public String getName(){
		return "father";
	}
}

public class Son extends Fahter{

	public void pendingTestMethod(){
		………………
		getFatherName();
		………………
	}
	
	private String getFatherName(){
		return getName();
	}
}

待测试的主要逻辑都在getFatherName()方法中,所以没有直接mock该方法。
那么这种情况,如何mock父类的getName()方法呢,代码如下:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Fahter.class)
public class XXTest{
    @Test
    public void test() {
        // 找到getConfig()方法,替换为自己实现
        Method method = PowerMockito.method(Son.class, "getName");
        PowerMockito.replace(method).with((proxy, method1, args) -> something);
        // 你的测试逻辑
    }

}

其实这里的逻辑是和mock枚举类方法一样的,只不过,这里需要注意的是,在反射获取待替换方法的时候(这次我是用的是PowerMockito.method(Son.class, “getName”)),是在子类方法中获取父类的这个方法,这个需要注意一下。

暂时就碰见这三种比较棘手的情况,以后在遇到复杂情况再来加。
有错误的地方欢迎指正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerMock使用问题及方案个人总结帖 的相关文章

随机推荐

  • 微博粉丝走势监控

    前言 因为之前写过很多爬虫 xff0c 然后近期也是选秀节目比较多 xff0c 像创造营 xff0c 青春有你等 一般情况下微博粉丝的增长速度是节目组比较关注的数据之一 因此 xff0c 想做一个简单的粉丝监控平台 xff0c 话不多说 x
  • ubuntu系统下各个目录的一般作用

    1 这是根目录 xff0c 一个Ubuntu系统下只有一个根目录 2 root 系统管理员的目录 3 boot 系统启动文件 4 bin 存放系统程序 5 etc 存放系统配置方面的文件 6 dev 存放与设备有观点文件 xff0c 例如
  • C/C++中枚举类型enum使用

    1 说明 xff1a 枚举enum的出现 xff0c 主要是为了解决一些特定属性的赋值 xff0c 变量取值仅在一定有限范围内的问题 例如一年只有十二个月取值 xff0c 一个星期只有七天情况 xff0c 人的性别只有男女两种等 这些属性如
  • Matlab中save实现保存数据到mat文件的正确使用

    主要需要注意save savePath A 和 save savePath 39 KSD 39 两种写法的区别 1 普通保存在当前文件夹下 save matPath mat span class hljs literal A span B
  • C/C++笔试必须熟悉掌握的头文件系列(三)——stdlib.h/cstdlib

    1 说明 stdlib h 头文件即标准库头文件 xff08 standard library xff09 xff0c stdlib 头文件里包含了C语言的最常用的系统函数 而C 43 43 中有对应相同作用的 cstdlib 头文件 xf
  • matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明

    1 matlab图像保存说明 matlab中读取图片后保存的数据是uint8类型 8位无符号整数 xff0c 即1个字节 xff0c 以此方式存储的图像称作8位图像 xff0c 好处相比较默认matlab数据类型双精度浮点double xf
  • PyCharm安装第三方库如Requests

    PyCharm安装第三方库是十分方便的 xff0c 无需pip或其他工具 xff0c 平台就自带了这个功能而且操作十分简便 如下 xff1a 注 xff1a 本人PyCharm已汉化 xff0c 若是英文版按括号中英文指示操作即可 1 打开
  • 关于django的ORM查询出来的数据格式的转换:OrderedDict类型转换为list;serializers序列化器配置字段可以为null

    目录 一 django查询的结果的类型是 xff1a OrderedDict类型 xff0c 如下 xff1a 二 serializers序列化器配置字段可以为null 一 django查询的结果的类型是 xff1a OrderedDict
  • pyCharm上解决安装不上pandas库问题

    最近在PyCharm上安装pandas库的时候 xff0c 总是安装不上 xff0c 提示好像是pip除了错误 我使用的是python 3 4版本 最后判断应该是自己pip版本应该太旧了 xff0c 最后再cmd更新了pip之后就行了 如下
  • 详细图解哈夫曼Huffman编码树

    1 引言 哈夫曼 xff08 Huffman xff09 编码算法是基于二叉树构建编码压缩结构的 xff0c 它是数据压缩中经典的一种算法 算法根据文本字符出现的频率 xff0c 重新对字符进行编码 因为为了缩短编码的长度 xff0c 我们
  • matlab生成随机数的rand、randi和randn三种形式

    matlab中关于随机数的产生有3种库函数 xff0c 下面我们来看看它们的形式 xff1a 1 rand 它是生成0 1之间 xff08 开环 xff0c 不包含0和1两个数 xff09 均匀分布的伪随机数 xff0c 也就是无穷次试验其
  • Linux解压tar.gz和tar.bz2的命令

    两者的命令主要是参数的不同 xff0c 解压tar gz和tar bz2不同压缩文件的命令如下 xff1a 1 解压tar gz文件 tar zxvf span class hljs preprocessor tar span span c
  • C/C++枚举enum分别打印输出枚举子和枚举值的方法

    关于枚举枚举的基础概念我这里不再介绍 xff0c 感兴趣的同学可以查阅另一篇博文C C 43 43 中枚举类型enum使用 这里我主要提一下在调试一个大型程序中遇到日志打印中一个关于枚举输出的小错误 我们知道枚举分为枚举子和枚举值 xff0
  • C++程序抛出异常后执行顺序

    1 析构函数中是否可以抛出异常 首先我们看一个常见的问题 xff0c 析构函数中是否可以抛出异常 答案是C 43 43 标准指明析构函数不能 也不应该抛出异常 xff01 C 43 43 异常处理模型是为C 43 43 语言量身设计的 xf
  • Go语言变量的生命周期

    1 变量的生命周期 生命周期是指程序执行过程中变量存在的时间段 下面我们分别来看看包变量 xff08 全局变量 xff09 和局部变量两种变量的生命周期 包变量一直常驻在内存到程序的结束 xff0c 然后被系统垃圾回收器回收 也就是说包变量
  • Linux下修改gcc和g++的版本

    xff11 前言 最近 xff0c 自己在linux调试matlab的mex的时候 xff0c 突然发现matlab R2015版本对应的mex适配环境是gcc 4 7 xff0c 而自己ubuntu的Linux对应版本默认却是gcc 4
  • ubuntu配置安装Qt4.8.4 同时配置openssl和QtWebkit

    ubuntu配置安装Qt4 8 4 这里要说明的几点 xff0c 首先项目中要用到openssl支持的在配置Qt环境时首先要安装配置openssl xff1b 其次如果要用到Qt的QtWebkit的一定要主要在配置中一定要有配置这个模块 Q
  • error LNK1104: 无法打开文件“kernel32.lib”错误 Visual Studio 2017解决办法

    出现这种情况可能是在x86下或者x64下 解决办法 视图 gt 其他窗口 gt 属性管理器 xff08 这里默认所有项目都存在该问题 xff0c 对所有vs属性设置进行调整 xff09 可以看到其中有Win32 xff08 即为x86 xf
  • 【算法】冒泡排序

    冒泡排序 假设 xff0c 有一个数组初始状态为 2 xff0c 5 xff0c 8 xff0c 4 xff0c 3 xff0c 1 下面给出排序的过程 xff1a 程序代码 xff1a public class BubbleSortCla
  • PowerMock使用问题及方案个人总结帖

    最近一直有使用PowerMock进行测试 很方便 xff0c 但是当待测试方法的调用情况比较复杂的时候 xff0c 往往不知道怎么处理 在这里把自己的解决方法整理一下做个备份 直接以问题 解决方法的方式 1 PowerMock mock 静