Mockito NullPoInterException在InvocationMatcher上调用等于



我是Mockito的新手,尝试模拟第三方类时遇到错误。

堆栈跟踪:

java.lang.NullPointerException
at MockitoTest.equals(MockitoTest.java:34)
at org.mockito.internal.invocation.InvocationMatcher.matches(InvocationMatcher.java:58)
at org.mockito.internal.stubbing.InvocationContainerImpl.findAnswerFor(InvocationContainerImpl.java:75)
at org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:87)
at org.mockito.internal.handler.NullResultGuardian.handle(NullResultGuardian.java:29)
at org.mockito.internal.handler.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:38)
at org.mockito.internal.creation.MethodInterceptorFilter.intercept(MethodInterceptorFilter.java:51)
at MockitoTest$$EnhancerByMockitoWithCGLIB$$cde393a2.getSomethingElse(<generated>)
at MockitoTestTest.test(MockitoTestTest.java:19)

Mockito正在调用此模拟上的等价方法,该方法没有其某些私人成员设置。代码:

public void test() {
    final String something = "something";
    final String somethingElse = "somethingElse";
    MockitoTest mt = Mockito.mock(MockitoTest.class);
    when(mt.getSomething()).thenReturn(something);
    when(mt.getSomethingElse()).thenReturn(somethingElse);

被嘲笑的类是这样的:

public class MockitoTest {
private final String something;
private volatile String somethingElse;
public MockitoTest(String theThing){
    something = theThing;
}
public String getSomething(){
    return something;
}
public String getSomethingElse(){
    return somethingElse;
}
@Override
public final int hashCode() {
    return something.hashCode();
}
@Override
public final boolean equals(Object o) {
    if(!(o instanceof MockitoTest))
        return false;
    return something.equals(((MockitoTest)o).something);
}

}

很明显地看到来自equals()的NPE是因为构造函数未运行而没有设置"某物"。

我的问题:为什么在()呼叫时第二次发生这种情况?有没有办法防止对等法的调用?我做错了吗?

注意:上面的示例是为了显示发生的错误。我要模拟的真正课程是在第三方库中,无法轻易更改。它不是微不足道的构造,并且需要在第三方软件包之外看不见的类型。缺少在他们的包装中写我的测试,我还可以做其他事情来嘲笑它吗?

我很确定您的问题是equalshashCode是您要模拟的类中的final。Mockito需要覆盖这些方法;因此,这类可能是无法锁定的。

无论如何,嘲笑第三方课程通常是一件坏事。您是否有可能重构应用程序,以便将第三方类包装?您的包装器应仅揭示您需要使用的方法。当您编写单元测试时,您只需模拟包装器。

相关内容

  • 没有找到相关文章