簡體   English   中英

有沒有辦法驗證在使用JUnit時是否在測試方法中調用try / catch指令的Catch部分?

[英]Is there a way to verify if the Catch part of a try/catch instruction is called in a test method when using JUnit?

例如,如果我有以下要測試的類:

public class SomeClass{
    public void someMethod() {
        try {
            //Some code, where comething could go wrong
        } catch (Exception err) {
            //Handling it amounts to logging the problem and trying to continue
        }
    }
 }

如果我然后使用JUnit測試此方法,那么如果try子句中出現問題並且運行了catch代碼,那么測試將通過。

我想這樣做,以便在運行catch子句指令時測試將失敗。

我確實想到了一些我可以嘗試編寫測試的方法,這樣我就可以獲得相同類型的功能,但是每個我都不希望以這種方式接近它。 如果達到任何catch子句似乎試圖通過測試失敗是最干凈的方法,如果這實際上是可能的

筆記:

我知道我可以驗證代碼的某些功能,並檢查它們是否是某個值/已經與Mockito一起運行了很多次。 但是我想要一個解決方案,如果對測試方法進行了改變,從根本上改變了它的工作方式(但不是基本上執行了什么任務),那么我就不必重寫測試了。

不幸的是,為了使這個問題更加困難,我無法對源代碼進行任何修改。 這個位置是我無法控制的,所以我必須在這些范圍內工作。


編輯:

SomeClass是我想測試的類。 它不是實際的JUnit測試。 我已經編輯了我的原始問題,試圖澄清這一點。

我以前不得不處理這類問題。 我最終嘲笑日志子系統(不簡單但不過於復雜),並聽取了“有趣的”日志記錄調用,然后在發生故障時標記失敗。

請記住,您正在測試此功能的行為。 您的測試不應該關心(因此不測試)捕獲異常,只是您想要的行為發生。

這意味着如果您想測試某些內容是否已記錄。 然后你必須驗證記錄的事情。 在我的幾個應用程序中,我區分了調試日志記錄和重要的logmessage。 后者我們通過一個類發送(在我們的例子中,我們使用了Facade設計模式)。 我們可以模擬(從而測試調用)。 對於大多數應用程序,大多數開發人員日志記錄不必進行測試,因此在這些情況下您應該忽略它。

我不知道任何框架可以讓你斷言異常在方法中被拋出和處理而不是傳播。 從問題描述中我會看到兩種方法,都使用BDD:

  1. 不會調用catch塊內的一行代碼 - 記錄器將是一個很好的選擇,因為@Thirler建議
  2. 斷言不會調用異常構造函數

兩者都有問題:

  1. 不是很干凈,因為它與正在執行的實際代碼緊密耦合。
  2. 代碼中處理的任何異常都會觸發失敗。

您可以嘗試使用aspectj來檢測代碼並標記在執行SomeClass.someMethod時拋出了異常。

一般來說,

-1-檢查某個函數f()是否拋出異常

try {
  f();
  // notify test failure here
} catch (...) {
  // success
};

-2-檢查它沒有

try {
   f();
} catch(...) {
   // notify test failure here
}

你可以考慮使用斷言

什么斷言你可能會問:

斷言是JavaTM編程語言中的一個語句,使您可以測試對程序的假設。 例如,如果您編寫一個計算粒子速度的方法,您可能會斷言計算出的速度小於光速。

我沒有詳細說明,因為我無法解釋它比自己的文件更好。

暫無
暫無

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

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