我是Mockito新手,在嘗試模擬第三方類時遇到了錯誤。Mockito NullPointerException在InvocationMatcher上調用equals等於
堆棧跟蹤:
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調用這個模擬,不具有一些設置私有成員的equals方法。代碼:
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);
}
}
很清楚地看到,NPE從平等的未來()正在發生的事情,因爲構造函數是不是沒有設置運行和'某事'。
我的問題:爲什麼在第二次調用()時發生這種情況?有沒有辦法阻止equals方法被調用?難道我做錯了什麼?
注意:上面的例子被設計爲顯示錯誤發生。我試圖嘲笑的真正的課程是在一個不容易改變的第三方庫中。它不是輕而易舉地構建的,它需要一種在第三方包之外不可見的類型。正如上面的嘗試一樣,在我的測試包中寫下我的測試之餘還有什麼我可以做的來嘲笑它呢?
您確定它是在「何時」發生錯誤?沒有無參數的構造函數,我不認爲變量會初始化,因此它們將爲空,但我不確定爲什麼你使用when()語句獲得NPE,因爲這不重要。 –
哦,如果你正在模擬一個具體的對象,你可以嘗試一下spy()和doReturn(「asdfasd」)的Mockito語法。when(foo).doThing()。 –