我已经坚持了一段时间,尝试搜索,但还没有找到任何其他帮助我的帖子。我已经获得了下面的代码并要求编写一个简单的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是否有任何参数被调用。我做错了什么?