使用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);
  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值