簡體   English   中英

在測試拋出異常的方法時驗證行為

[英]Verifying behavior when testing a method that throws an exception

最近,在一次代碼審查中,一位同事說“測試不應該有試試塊”。 他還向我指出了有關ExpectedException信息,並且我能夠使用它來重寫我正在對異常數據執行檢查的一些測試。

但是,我遇到的情況是我不確定我是否可以消除try-catch。 我正在為一個方法編寫單元測試,該方法將拋出一個異常執行一些我需要使用JMockit驗證的行為。 假設測試中的代碼包含類似的內容

try {
    ...code...
} catch (SomeException e) {
    statusMessage.send("Failure", <parameters with some data>);
    throw e;
}

JUnit測試目前看起來像

@Test
public void test() {
    ... set things up ...
    try {
        callTheMethod();
        fail("No exception thrown");
    } catch (Exception e) {
        assertEquals(SomeException.class, e.getClass());
    }
    new Verifications() { {
        statusMessage.send("Failure", <expected data>);
    } }
}

我找不到擺脫try-catch的好方法。 我個人認為沒有問題,但如果我不至少試圖擺脫它,我很可能會趕上我的同事:) :) :)

failassertEquals不是必需的。 如果有一種簡單的方法告訴JUnit / JMockit簡單地忽略來自callTheMethod()任何異常並繼續,那就沒關系 - 我可以創建另一個測試來檢查異常。

是否有一些JUnit或JMockit功能可以讓我完成我想要做的事情?

[注意:編輯清楚我正在測試的行為是對模擬對象的調用,而不是靜態方法調用。 這與問題無關。]

您的同事在一般意義上可能是正確的,使用try-catch測試您的異常處理比使用提供的ExpectedException實用程序更不可取。 但是,我不認為該規則適用於您的情況; 捕獲異常,以便您可以驗證其他事情是完全合理的。 沒有其他方法可以阻止傳播AFAIK的異常。

目前使用普通的JUnit,如果要在拋出斷言后驗證某些內容,則必須使用try-catch 使用JUnit 4.13(尚未發布),您可以使用

expectThrows(Exception.class, () -> callTheMethod());
new Verifications() { {
    statusMessage.send("Failure", <expected data>);
} }

作為替代方案,您可以使用Fishbowl的ignoreException

ignoreException(() -> callTheMethod());
new Verifications() { {
    statusMessage.send("Failure", <expected data>);
} }

完全披露:我是Fishbowl的作者。

根據API ,我會說你可以這樣做:

class AjbUnitTest
{
    @Rule 
    public ExpectedException thrown = ExpectedException.none();

    @Test
    public void test()
    {
        ... set things up ...
        thrown.expect(SomeException.class)
        callTheMethod();  / Preumably this throws SomeException
        ...
    }
}

對於異常特定的斷言, AssertJ有一個很好的API:

@Test
public void testException() {
   assertThatThrownBy(() -> { throw new Exception("error!") })
     .isInstanceOf(Exception.class)
     .hasMessageContaining("error");
}

基本上,您可以“收集”異常而不會中斷測試執行。

暫無
暫無

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

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