我是靠谱客的博主 复杂火,最近开发中收集的这篇文章主要介绍使用PowerMockito对静态方法进行mock,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用PowerMockito.mockStatic(class)创建静态类的mock对象

注意事项: 如果想对某个类的静态方法进行mock,则必须在PrepareForTest后面加上相应的类名,比如Utility.class.

  • 当使用mockStatic方法对Utility.class进行了mock,那么此时该类中的所有方法实际上都已经被mock了,
    如果没有对某个方法进行具体mock返回值,则调用该方法时,会直接返回对应返回类型的默认值,并不会执行真正的方法.(如果方法返回值类型是boolean,则默认返回false).

  • 想对已经mock的类的某个方法调用真实的方法,而不是调用mock方法,该如何处理?
    方法1.使用PowerMockito.spy(Utility.class)
    可以再次使用PowerMockito.spy(Utility.class),之后的方法调用,会执行真正的方法体内容.
    使用spy后,虽然已经对该类做了mockStatic处理,但此时该类中的所有方法仍然都会调用真实的方法,而不是默认的mock方法.
    这种用法主要适用于只想要对某个类的少量方法进行mock,其他方法仍然执行真正的方法,平常写时,可以紧跟在mockStatic方法之后.
    方法2: 使用thenCallRealMethod()方法
    doCallRealMethod().when(MockObject).methodName();
    或者PowerMockito.when(Utility.listIsNotNullOrEmpty(Mockito.anyList())).thenCallRealMethod();
    此行的含义就是调用到mock类的该方法执行真正的方法,而不是mock方法.

参考网址:https://www.jianshu.com/p/0c2480b1709e

模拟返回值为void的静态方法:

对于void类型的静态方法,我们不对该方法做任何的mock,同样不会走真正的方法体.
这是因为mock整个类时,该类的所有方法就已经都被mock了,并且按照默认的方式进行处理,此时对于返回值为void的方法就是什么都不做。

显示对void方法进行mock,使用doNothing()mock静态方法

1.PowerMockito.doNoting().when(Utility.class,"doSomething",Mockito.any());

此处采取的when原型如下:

<T> void when(Class<T> classMock,String methodToExpect,Object... parameters) throws Exception;
函数注释如下,
Allows to mock a static private method based on method name and parameters when stubbing in doThrow()|doAnswer()|doNothing()|doReturn() style
Example:
doThrow(new RuntimeException()).when(MyClass.class, "methodName", parameter1, parameter2);

可见该种方式主要适用于对私有静态且无返回值的方法进行mock。

2. PowerMockito.doNothing().when(Utility.class);
Utility.doSomething(Mockito.any());

此处采取的when原型如下:

void when(Class<?> classMock);
函数注释如下,
Allows to choose a static method when stubbing in doThrow()|doAnswer()|doNothing()|doReturn() style
Example:
doThrow(new RuntimeException()).when(StaticList.class);
StaticList.clear();

可见该种方式主要适用于对公有静态且无返回值的方法进行mock。

综上,对于无返回值的静态方法,可以有两种方式实现mock:
(1)隐式写法,即只需要mock静态类即可;
(2)显示写法,此时需要根据方法是私有的还是公有的选择相应的格式.

参考网址:https://www.jianshu.com/p/44163d1089dd

TestCase期望异常的设置: 在@Test后面使用(expected = Exception.class)
example: @Test(expected = Exception.class)

对static方法进行执行次数的验证:(listIsNullOrEmpty是Utility中的静态方法)

PowerMockito.verifyStatic(Mockito.times(1));
Utility.listIsNullOrEmpty(Mockito.anyList());
先使用verifyStatic方法表名要验证静态方法,可以带参数,也可以不带参数,其参数可以使用Mockito的times
方法或never方法来表示其调用次数.下面紧跟着的一行则表示要验证的是已经mock的静态方法.

对mock对象的方法进行期望返回值的使用方式:

PowerMockito.when(mockObject.mockMethod(params)).thenReturn(returnValue);
PowerMockito.when(mockObject,"mockMethodName",params..).thenReturn(returnValue);

最后

以上就是复杂火为你收集整理的使用PowerMockito对静态方法进行mock的全部内容,希望文章能够帮你解决使用PowerMockito对静态方法进行mock所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部