如何验证使用Powermockito从另一个私有方法调用私有方法?

时间:2018-01-25 06:05:40

标签: unit-testing junit mockito powermock powermockito

我已经坚持了一段时间,尝试搜索,但还没有找到任何其他帮助我的帖子。我已经获得了下面的代码并要求编写一个简单的JUnit测试来验证从A调用B。

public class Testable {
     // some public methods here
     // ...

     private void A(int i) {
         Map<Integer, Integer> aMap = new ...
         // some logic that modifies aMap
         // ...

         if (i == 1) {
             B(aMap);
         }

     private void B(Map<Integer, Integer> aMap) {
         // some code
     }
}

所以我写了以下测试:

@Test
public void testBCalledFromA() throws Exception {
    Testable mockTestable = PowerMock.createPartialMock(Testable.class, "B");
    int i = 1;

    Whitebox.invokeMethod(mockTestable, "A", i);
    PowerMock.replay(mockTestable);
    PowerMockito.verifyPrivate(mockTestable, Mockito.times(1)).invoke("B", Mockito.any());
}

由于A是私有方法,我使用的是Whitebox.invokeMethod。 Testable模拟是一个部分模拟,因为我只想测试B被调用而不是进入它的实现,虽然我不介意它是否真的。

我知道我可以公开/保护这些方法,但我想知道为什么这不起作用,我可以做些什么来修复它而不改变可见性。

这是我得到的错误:

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 2.028 sec <<< FAILURE!
testBCalledFromA(TestClass.testBCalledFromA)  Time elapsed: 0.729 sec  <<< FAILURE!
java.lang.AssertionError:
  Unexpected method call B(null):
    B({}): expected: 1, actual: 0
        at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:45)
        at org.powermock.api.easymock.internal.invocationcontrol.EasyMockMethodInvocationControl.invoke(EasyMockMethodInvocationControl.java:95)
        at org.powermock.core.MockGateway.doMethodCall(MockGateway.java:105)
        at org.powermock.core.MockGateway.methodCall(MockGateway.java:168)
        at Testable.B(Testable.java)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:2014)
        at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:885)
        at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:713)
        at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:401)
        at org.powermock.api.mockito.internal.verification.DefaultPrivateMethodVerification.invoke(DefaultPrivateMethodVerification.java:38)
        at TestClass.testBCalledFromA(TestFactDataHandler.java)

从我可以收集的内容来看,我的测试中的verifyPrivate行实际上是使用null参数调用该方法,我不确定它为什么这样做。我想做的就是验证B是否有任何参数被调用。我做错了什么?

0 个答案:

没有答案