簡體   English   中英

Junit Eclipse - 預期異常時沒有成功的堆棧跟蹤

[英]Junit Eclipse - No stack trace on success when exception is expected

我有使用 @Test(expected=) 語法的 junit 測試。 當我運行這些測試時,會生成異常並且測試通過,但異常的堆棧跟蹤仍記錄在控制台中。

這是令人困惑的,因為沒有跡象表明哪個測試生成了什么消息。 我有很多測試,我不知道這些堆棧跟蹤是否只是預期的異常,或者測試中存在一些問題。

如果測試成功,有沒有辦法阻止期望從日志中拋出異常的測試?

是的。 不要記錄它們。 這不是 JUnit 打印那些東西。 是你,在你自己的(非測試)代碼中。 JUnit 不能神奇地潛入那里,找出您編寫的代碼明確告訴 VM 無緣無故地打印跟蹤,並以某種方式抑制它。

這不是你的錯,而是......大量的教程,甚至在這里,答案,以及導致你走上這條道路的瘋狂 IDE 默認設置。

所以,修復它! 這不是太難; 啟動 IDE 的全局搜索工具並尋找e.printStackTrace() 將它們全部消除 現在是狩獵季節。

那么,你會怎么做呢? 幾個步驟:

  1. 首先要做的事情是:輸入您的 IDE 設置並在使用“添加 try/catch”的快速修復時修復模板。 catch 塊應該是throw new RuntimeException("uncaught", e); ,而不是e.printStackTrace()

  2. 任何時候一個方法的本質固有地暗示它會拋出一個特定的檢查異常,讓它這樣做。 一個throws IOException名為openFile的方法寫得不好。 讓它拋出那個,然后消除try/catch(Exception e) {e.printStackTrace();} ,我們以后將其命名為“渡渡鳥模式”。 這應該擺脫大約一半的人。

  3. 接下來是您使用 dodo 模式“修復”的已檢查異常並不是方法本質的固有部分。 例如,假設您編寫了一個游戲保存系統,並且您當前的實現通過將其寫入數據庫來工作,並且您對SQLException進行了 dodo 模式。 保存游戲本身並不意味着數據庫交互,因此編寫public void saveGame() throws SQLException不一定是好的設計。 幾乎所有此類情況的解決方案是將異常重新包裝為其他內容。 例如,創建一個SaveException類。 確保它具有接受消息原因的構造函數。 然后:

} catch (SQLException e) {
  throw new SaveException("Cannot save game", e);
}

保持消息簡短,甜蜜,不要添加多余的信息(如果您的消息涉及“出現問題”-您做錯了。這是一個最終未被發現的例外。暗示出了問題,無需說它)。 並且絕對不要添加感嘆號。

有時你不需要例外,可以重新包裝成更有用的東西。

  1. 這留下了您仍然懷疑是否真的會發生的已檢查異常。 也將它們重新包裝到RuntimeException或其他一些簡單的東西中,或者使用@SneakyThrows@SneakyThrows來實現這些。

這應該讓您擺脫每一個討厭的.printStackTrace()調用。 一旦你這樣做了,你的問題就會消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM