使用Powermock对私有方法进行mock

  在public方法中往往会调用一些private方法,如果private方法很复杂,我们就需要处理很多方法的mock。如果这时只想要测试public方法,并不想关注private方法的逻辑,那么就需要对private方法进行mock。下面我们简单介绍下如何通过Powermock来对私有方法进行mock。

被测试类:

public class MockPrivateClass {
    public String mockPrivateFunc() {
        return  privateFunc();
    }

    private String privateFunc() {
        return "private func";
    }
}

  此类中包含一个public方法mockPrivateFunc,里面调用了private方法privateFunc。当前我们想要测试该public方法,并且不想进入private方法执行,那么就需要对该私有方法进行模拟。

测试类:

@RunWith(PowerMockRunner.class)
@PrepareForTest({MockPrivateClass.class})
public class MockPrivateClassTest {
    private MockPrivateClass mockPrivateClass;

    @Test
    public void testMockPrivateFunc() throws Exception {
        mockPrivateClass = PowerMockito.spy(new MockPrivateClass());

        PowerMockito.when(mockPrivateClass, "privateFunc").thenReturn("test");

        String realResult = mockPrivateClass.mockPrivateFunc();

        Assert.assertEquals("test", realResult);

        PowerMockito.verifyPrivate(mockPrivateClass, Mockito.times(1)).invoke("privateFunc");

    }
}

  1、由于是对本类的私有方法进行模拟,所以需要在PrepareForTest后面加上MockPrivateClass,同时需要使用spy来模拟一个对象。
  2、 使用下面方式来模拟私有方法:

PowerMockito.when(mockPrivateClass, "privateFunc").thenReturn("test");

  如果私有方法存在参数,则同样的需要在私有方法名后面带上同样个数及类型的参数,其方法原型为:

 public static  OngoingStubbing when(Object instance, String methodName, Object... arguments) throws Exception;

  3、使用verifyPrivate来验证私有方法被调用,其例如下:

PowerMockito.verifyPrivate(mockPrivateClass, Mockito.times(1)).invoke("privateFunc");

  verifyPrivate的参数为mock的对象,及验证模式(可选),invoke参数为要验证的私有方法名称及相应参数。

你可能感兴趣的:(使用Powermock对私有方法进行mock)