簡體   English   中英

Junit5 驗證執行過程中是否拋出異常

[英]Junit5 verify if an exception was thrown during the execution

在 JUnit5 中,我如何驗證是否曾經拋出異常但后來在執行期間被捕獲? 例如,考慮

public Optional<Foo> MethodA(Argument a)  {
try {
    /*
        Some logic based on Aargument a providing biproduct Argument b
    */

        methodB(b)

    /*
        some other logic capable of throwing exception
    */

    } catch(Exception e) {
        // log  exception
        return Optional.empty();
    }
}

private BReturnValue MethodB(Argument b) throws Exception{
    throw new IllegalStateException() 
}

現在無論哪種方法,無論是 A 還是 B 拋出異常,作為 MethodA 的返回值,我都會收到一個空的 Optional,因此我不能使用 assertThrows() 但我實際上正在測試一個會導致 MethodB 拋出異常的測試用例。 我可以,如果可以,我如何驗證在執行期間是否從MethodB引發了異常?

筆記

  • 目前我正在使用 2 個測試,一個是驗證是否返回了空 Optional,另一個是通過手動提供 biproduct biproduct argument和使用assertThrows()

但我正在尋找一些更好的方法來驗證 biproduct biproduct argument是由 MethodA 形成的,而 methodB 引發了異常。 而且我不想直接測試MethodB ,而是通過MethodA

JUnit 無法檢測拋出並捕獲的異常。 這將需要分析執行情況,雖然在某種程度上它在技術上可能是可行的,但實施如此復雜的機制會適得其反。

在這種情況下,我想知道為什么對拋出異常的測試很重要? 在任何情況下,只要您的測試將Optional.empty()返回值視為失敗的測試,測試就會失敗,盡管它可能根本不應該捕獲異常。 在這種情況下,如果測試失敗,您必須做額外的工作來確定出了什么問題,但您仍然得到了重要信息:出了問題。

如果您覺得知道異常發生在哪里很重要,那么很可能應該單獨測試這些方法,這需要重新設計/重構代碼以更容易測試。

暫無
暫無

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

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