簡體   English   中英

同時使用junit斷言和Mockito驗證

[英]Using both junit assertions and mockito verification

我將Junit與Mockito結合使用。 我使用了Mockito的verify方法+ junit斷言來完成驗證。 這是不可取的嗎? 我們應該使用其中一個,但不能同時使用兩者?

兩者都沒錯。

Mockito的verify用於斷言在給定模擬中調用了一個方法(帶有預期的參數)。

JUnit的assertXYZ用於斷言某些結果具有預期值。

兩者都是有效的驗證,如果兩者都相關,則都應使用。

例如,考慮以下(公認的人為)情況:

您具有執行一些數學計算的接口:

public interface ValueProducer {
    public int getValue(int val);
}

一個將其產生的任何結果加倍的類:

public class Doubler {
    public static int doubleThatResult (ValueProducer producer, int val) {
        return 2 * producer.getValue(val);
    }
}

測試它需要聲明兩件事:

  1. 正確地調用了getValue
  2. 結果翻倍

因此,例如:

public class DoublerTest {

    @Test
    public void testDoubleThatResult() throws Exception {
        int value = 7; // Or any other value
        int returnMock = 13; // Or any other value

        ValueProducer producerMock = mock(ValueProducer.class);
        when(producerMock.getValue(value)).thenReturn(returnMock);

        int actual = Doubler.doubleThatResult(producerMock, value);

        verify(producerMock);
        assertEquals(26, actual);
    }
}

Mureinik的答案是絕對正確的-斷言和驗證是相輔相成的,並且可以很好地協同工作-但對單個行為執行兩項操作可能是多余的。

通常,目標是以最靈活且與實現無關的方式表示測試。 從這種意義上講,狀態測試(帶有斷言)通常是最合適的選擇:只要結果狀態正確,調用哪種方法都沒有關系。 Mockito驗證雖然可能,但可能會帶來脆性(代碼行為正確,但測試已失敗)。 Mockito本身會在verify(T)的JavadocMockito的創建者Szczepan Faber的鏈接文章中對此進行警告。

這種冗余肯定不是最壞的事情:它確實測試了系統的屬性,並且可能是在測試與敏感的,遺留的,第三方的或頻繁變化的依賴關系的交互中值得進行的工作。 但是,如果交互作用不重要,則這些額外的驗證可能會犧牲脆性。

在其他時候,確認正確的行為意味着測試副作用,例如,確保調用了someSystem.reset() ,或者通過驗證未調用提供程序來測試緩存。 這些是驗證的完美示例,因為與外部服務的交互是關鍵的可測試行為。 在某些情況下,Mockito驗證是做出正確斷言的唯一方法。

許多測試用例是上述情況的組合,因此可以隨意自由使用聲明和驗證。 請記住,狀態測試通常是足夠且可取的。

暫無
暫無

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

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