我正在嘲笑一個相當複雜的對象層次結構,並且在我正在通過它的時候,有大量的方法可以參與其中。如果我錯過並留下一個非無效方法,默認情況下Mockito會返回null,這會很快觸發NPE,並且我很容易找到它。但是,如果我錯過了一個無效方法,默認行爲是什麼都不做,這往往會導致進一步下游的故障,並且更難以調試。我想改變這個默認設置,例如拋出一個自定義異常,但似乎沒有找到辦法。 在此先感謝!如何覆蓋Mockito中未打開的void方法的默認行爲?
0
A
回答
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方法與外部足夠模擬服務上的存根相關,那麼它可能是一種代碼異味,說明你的服務正在做很多事情,或者說你的系統 - 測試不足的相互作用沒有被很好地定義。如果您經常發現自己處於這種情況,那麼可能需要記錄,重構或兩者兼而有之。
相關問題
- 1. 覆蓋默認expandablelistview展開行爲
- 2. 覆蓋typeheadhead默認行爲
- 3. 覆蓋JTextPane中TAB的默認行爲
- 4. 如何覆蓋C++中allocator類中構造方法的默認行爲STL
- 5. 查看方法的默認行爲覆蓋
- 6. Bootstrap覆蓋WordPress的默認行爲
- 7. 覆蓋longClick上的默認行爲()
- 8. 覆蓋默認的argparse -h行爲
- 9. 覆蓋GetEnumerator的默認行爲
- 10. 覆蓋默認的tableview setEditing行爲
- 11. 覆蓋UIActivityViewController的默認行爲
- 12. 如何覆蓋android中的backButton默認方法?
- 13. 如何覆蓋django-rest-framework中的默認創建方法
- 14. 如何覆蓋默認方程?
- 15. 如何覆蓋Resources.Designer.cs中的默認System.Resources.ResourceManager?
- 16. 如何覆蓋select的默認行爲:在jQuery UI Autocomplete中?
- 17. SailsJs - 覆蓋控制器默認方法
- 18. 覆蓋默認未處理的異常行爲
- 19. 如何覆蓋belongs_to的默認關聯=(關聯)方法?
- 20. GWT意見箱覆蓋默認行爲
- 21. 優先級覆蓋默認行爲
- 22. 用默認行爲覆蓋大寫?
- 23. 如何覆蓋Owin中的默認未處理異常輸出?
- 24. Android:如何覆蓋撥號器的默認行爲
- 25. 如何覆蓋Silverlight ListBox的默認行爲?
- 26. 如何覆蓋(重置)SIGUSR1的默認行爲?
- 27. 如何覆蓋django admin的默認文件上傳行爲?
- 28. 如何覆蓋瀏覽器文件的默認下載行爲?
- 29. 如何覆蓋默認的Spring JPA異常轉換器行爲?
- 30. 如何覆蓋默認的maven-install-plugin行爲?