PowerMock使⽤问题及⽅案个⼈总结帖
最近⼀直有使⽤PowerMock进⾏测试。很⽅便,但是当待测试⽅法的调⽤情况⽐较复杂的时候,往往不知道怎么处理。在这⾥把⾃⼰的解决⽅法整理⼀下做个备份。
直接以问题-解决⽅法的⽅式。
1.PowerMock mock 静态⽅法
mock静态⽅法,需要提前打上** @RunWith 和@PrepareForTest注解,@PrepareForTest**这个注解可⽤于类和⽅法。
关于** @RunWith 和@PrepareForTest**的使⽤场景,个⼈理解就是⽐较复杂的情形,⽐如mock私有⽅法,静态⽅法,mock在⽅法内部new的对象,final⽅法。
有了这两个注解,在mock静态⽅法之前,还需要使⽤** kStatic(YourStaticClass.class);**,之后就可以对该类的静态⽅法进⾏mock或者别的操作了。代码如下:
@RunWith(PowerMockRunner.class)
@PrepareForTest(YourStaticClass.class)
public class XXXTest {
@Test
public void test() {
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();
}
待测试⽅法中调⽤了Name();,现在要抑制这个⽅法。做法如下:
@RunWith(PowerMockRunner.class)
@PrepareForTest(
value = {NameEnum.class},
fullyQualifiedNames = {
"NameEnum$1"
}
)
public class XXTest {
@Test
public void test() {
// 替换NameEnum.ZHANGSAN的getName⽅法这⾥使⽤getDeclaredMethods()获取数组,再获取⽅法,
// 是经过测试,直接使⽤⽅法名获取⽅法,会报NoSuchMethod,才疏学浅,只好这么⽤
Method getName= Class().getDeclaredMethods()[0];
// with⾥⾯传⼊⼀个新的InvocationHandler实现,powermock将会使⽤这个实现替换原有⽅法
// 你的测试逻辑
}
}
整个的思路就是将枚举类中的⽅法替换为新的实现,在**@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{
enum怎么用@Test
public void test() {
// 到getConfig()⽅法,替换为⾃⼰实现
Method method = hod(Son.class, "getName");
// 你的测试逻辑
}
}
其实这⾥的逻辑是和mock枚举类⽅法⼀样的,只不过,这⾥需要注意的是,在反射获取待替换⽅法的时候(这次我是⽤的是hod(Son.class, “getName”)),是在⼦类⽅法中获取⽗类的这个⽅法,这个需要注意⼀下。
暂时就碰见这三种⽐较棘⼿的情况,以后在遇到复杂情况再来加。
有错误的地⽅欢迎指正
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论