當我的代碼中拋出一個未捕獲的異常時,我習慣於讓調試器在throwing語句處停止,以便我可以檢查本地變量以及所涉及的所有對象的成員拋出異常的時刻。隨着IntelliJ IDEA的這可以通過將運行,查看斷點,選擇異常實現斷點選項卡,檢查任何異常,並確保該捕捉到異常複選框是選中,而未捕獲的異常複選框被選中。使用Eclipse和Visual Studio(對於C#),它有些不同,但沿着相同的路線。JUnit 4和異常掛起
使調試器以這種方式工作的能力非常有用;實際上非常有用,我相應地構建了我的程序的主循環:在發行版本上,主循環當然嵌入了try-catch-all;但在調試版本中,主循環中沒有try-catch塊,所以任何在程序中任何地方都沒有捕獲到的異常都將保持未捕獲狀態,這樣調試器就會在拋出時暫停我的程序。但是,當使用JUnit測試我的Java類時,我遇到了一個問題:調試器不會停止任何異常。相反,發生的事情不僅是預期的,而且還有意想不到的異常會被自動捕獲,並且我會給出一個事後異常堆棧跟蹤來嘗試和理解。這不是很酷。我曾經認爲這是因爲JUnit利用java.lang.reflect.Method.invoke()
,它捕獲所有的異常並將它們轉換爲TargetInvocationExceptions
,但後來我編寫了自己的自定義JUnit運行器,它自己知道我的測試類並直接調用它的方法沒有Method.invoke()
,問題依然存在。這意味着這個問題在覈心JUnit中很高。
那麼,沒有其他人有同樣的問題?有誰知道一個解決方案,以便我們可以使用JUnit進行測試時讓調試器暫停程序對意外異常的執行?
相關(解答)問題:Suspend on uncaught runtime exceptions in Eclipse Junit test runner
相關(解答)問題:How to break into debugger within a jUnit test case?
相關(部分回答)問題:Break on Exception in Eclipse using jUnit(接受的答案說:「如果你在JUnit調試一個方法,如果整個類或包在jUnit中調試完畢,調試器將不起作用「)
您運行的是哪個版本的JUnit?我可以在我的測試中捕獲未捕獲的異常,Eclipse Indigo Build 20110615-0604,JUnit 4. – Perception
我正在使用JUnit 4.8.1。請注意,這個問題不是捕捉未捕獲的異常;這是關於讓調試器暫停未捕獲異常的程序執行。換句話說,如果拋出的異常是未捕獲的,那麼它的作用就像是一個斷點。 –
我想我不清楚。我的IDE(Eclipse Indigo)會自動暫停執行,如果我也告訴它,捕獲/未捕獲的異常。即使在運行JUnit 4測試時也是如此。 – Perception