2016-03-10 12 views
0

我正在嘲笑一個相當複雜的對象層次結構,並且在我正在通過它的時候,有大量的方法可以參與其中。如果我錯過並留下一個非無效方法,默認情況下Mockito會返回null,這會很快觸發NPE,並且我很容易找到它。但是,如果我錯過了一個無效方法,默認行爲是什麼都不做,這往往會導致進一步下游的故障,並且更難以調試。我想改變這個默認設置,例如拋出一個自定義異常,但似乎沒有找到辦法。 在此先感謝!如何覆蓋Mockito中未打開的void方法的默認行爲?

回答

1

您可以編寫一個默認答案,作爲參數傳遞給Mockito.mock。不幸的是,由於Java註釋的侷限性,對於@Mock -nnotated字段進行默認行爲並不那麼容易。

public static class ThrowingAnswer implements Answer<Object> { 
    @Override public Void answer(InvocationOnMock invocation) throws Throwable { 
    if (invocation.getMethod().getReturnType() == Void.TYPE) { 
     throw new UnsupportedOperationException(String.format(
      "Method %s not stubbed on %s", 
      invocation.getMethod().getName(), 
      invocation.getMock())); 
    } 
    return Answers.RETURNS_DEFAULTS.answer(invocation); 
    } 
} 

YourClass mockYourClass = Mockito.mock(YourClass.class, new ThrowingAnswer()); 

雖然你可能不得不被迫使用doAnswer()語法void方法,如果你改變了上述包括,你將不得不使用doReturn()語法非空方法知道。這是因爲when(foo.bar()).thenReturn(baz)依賴於在when()語句內對foo.bar()的調用,但您會將其存入其中以引發異常。另外,如果你發現很難判斷哪個void方法與外部足夠模擬服務上的存根相關,那麼它可能是一種代碼異味,說明你的服務正在做很多事情,或者說你的系統 - 測試不足的相互作用沒有被很好地定義。如果您經常發現自己處於這種情況,那麼可能需要記錄,重構或兩者兼而有之。

相關問題