php静态方法mock,使用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方法.

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

对于void类型的静态方法,我们不对该方法做任何的mock,同样不会走真正的方法体.

这是因为mock整个类时,该类的所有方法就已经都被mock了,并且按照默认的方式进行处理,此时对于返回值为void的方法就是什么都不做。

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

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

此处采取的when原型如下:

void when(Class 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)显示写法,此时需要根据方法是私有的还是公有的选择相应的格式.

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值