PowerMockito单元测试中的org.mockito.exceptions.misusing.UnfinishedVerificationException异常详解

首先给出测试方法的片段如下:

MyAgent rpc = new MyAgent("myAgentName");
PowerMockito.verifyPrivate(rpc).invoke("initNode");
PowerMockito.verifyPrivate(rpc).invoke("initPowerSwitch", Mockito.anyString(), Mockito.anyInt());

可以看出,测试方法的末尾要验证两个private方法确实被调用了。

在使用PowerMockito框架进行单元测试的过程中,发生如下异常:

org.mockito.exceptions.misusing.UnfinishedVerificationException: 
Missing method call for verify(mock) here:
-> at org.powermock.api.mockito.internal.invocation.MockitoMethodInvocationControl.performIntercept(MockitoMethodInvocationControl.java:260)

Example of correct verification:
    verify(mock).doSomething()

Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.

首先从异常发生的位置,异常发生在验证测试结果的阶段,也就是说单元测试中的打桩和执行测试都已经顺利执行完毕,而验证测试结果的语句出错。在我们的测试方法中,有两个verifyPrivate语句(先不淡在一个测试方法中出现两个verify语句的合理性,通常不建议),第一个verifyPrivate语句执行没有问题,而第二个verifyPrivate语句执行时,抛出了该异常。从异常的类型UnfinishedVerificationException,可以看出是由于第一个verifyPrivate语句执行未结束,就开始执行第二个verifyPrivate语句,从而导致异常。

其次从异常信息的最后一段,不能对final/private/equals()/hashCode()几类的方法进行验证。但是这是Mockito的异常,随着PowerMockito框架的发展,PowerMockito框架已经提供了专门的verifyPrivate()方法用以验证private方法,问题不在这里。

细读异常信息中的“verify(mock).doSomething()”,我们突然意识到,这里能够验证的必须是一个mock对象,而不能是一个真实对象,而我们的测试方法中恰恰用的是一个真实对象。于是修改测试方法如下后测试通过:

MyAgent rpc = PowerMockito.spy(new MyAgent("myAgentName"));
PowerMockito.verifyPrivate(rpc).invoke("initNode");
PowerMockito.verifyPrivate(rpc).invoke("initPowerSwitch", Mockito.anyString(), Mockito.anyInt());

参考链接:

https://github.com/mockito/mockito/blob/release/2.x/src/main/java/org/mockito/exceptions/misusing/UnfinishedVerificationException.java

https://github.com/powermock/powermock/blob/release/1.x/powermock-api/powermock-api-mockito/src/main/java/org/powermock/api/mockito/internal/invocation/MockitoMethodInvocationControl.java


猜你喜欢

转载自blog.csdn.net/taiyangdao/article/details/80691566