我有使用 @Test(expected=) 語法的 junit 測驗。當我運行這些測驗時,會生成例外并且測驗通過,但例外的堆疊跟蹤仍記錄在控制臺中。
這是令人困惑的,因為沒有跡象表明哪個測驗生成了什么訊息。我有很多測驗,我不知道這些堆疊跟蹤是否只是預期的例外,或者測驗中存在一些問題。
如果測驗成功,有沒有辦法阻止期望從日志中拋出例外的測驗?
uj5u.com熱心網友回復:
是的。不要記錄它們。這不是 JUnit 列印那些東西。是你,在你自己的(非測驗)代碼中。JUnit 不能神奇地潛入那里,找出您撰寫的代碼明確告訴 VM 無緣無故地列印跟蹤,并以某種方式抑制它。
這不是你的錯,而是......大量的教程,甚至在這里,答案,以及導致你走上這條道路的瘋狂 IDE 默認設定。
所以,修復它!這不是太難;啟動 IDE 的全域搜索工具并搜索e.printStackTrace()
. 將它們全部消除。現在是狩獵季節。
那么,你會怎么做呢?幾個步驟:
首先要做的事情是:輸入您的 IDE 設定并在使用“添加 try/catch”的快速修復時修復模板。catch 塊應該是
throw new RuntimeException("uncaught", e);
,不是e.printStackTrace()
。任何時候一個方法的本質固有地暗示它會拋出某個已檢查的例外,讓它這樣做。命名的方法
openFile
,做不throws IOException
只是寫的不好。讓它拋出那個,然后消除try/catch(Exception e) {e.printStackTrace();}
我們以后命名為“渡渡鳥圖案”的那個。這應該擺脫大約一半的人。接下來是您使用 dodo 模式“修復”的已檢查例外并不是方法本質的固有部分。例如,假設您撰寫了一個游戲保存系統,并且您當前的實作通過將其寫入資料庫來作業,并且您對
SQLException
. 保存游戲本身并不意味著資料庫互動,因此撰寫public void saveGame() throws SQLException
不一定是好的設計。幾乎所有此類情況的解決方案是將例外重新包裝為其他內容。例如,創建一個SaveException
類。確保它具有接受訊息和原因的建構式。然后:
} catch (SQLException e) {
throw new SaveException("Cannot save game", e);
}
保持訊息簡短,甜蜜,不要添加多余的資訊(如果您的訊息涉及“出現問題”-您做錯了。這是一個最終未被發現的例外。暗示出了問題,無需說它)。并且絕對不要添加感嘆號。
有時你不需要例外,可以重新包裝成更有用的東西。
- 這留下了您仍然懷疑是否真的會發生的已檢查例外。也將它們重新包裝成
RuntimeException
或其他一些簡單的東西,或者使用 lombok 來@SneakyThrows
實作這些。
這應該讓你擺脫每一個討厭的.printStackTrace()
電話。一旦你這樣做了,你的問題就會消失。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/313134.html