簡體   English   中英

mockito“驗證”檢查當前狀態,但不重置模擬調用

[英]mockito "verify" checks current state, but does not reset mock invocations

我在我的 JUnit 測試中使用 Mockito。 該測試是一個集成測試,測試整個場景,因此其中有很多斷言和verify(mock)

我的問題是,我正在編寫一些生產代碼,做一些斷言,然后驗證模擬是否有效,直到出現相同的模擬調用。 看簡化代碼:

interface I {
    void m1();
    void m2();
}

// some decorator
class T implements I {
    public T(I decorated) {
        /*...*/
    }

    /* ... */
}

public void testInvalid() {
    I m = mock(I.class);
    T t = new T(m);

    t.m1();
    assertEquals("m1", t.getLastMethod());
    verify(m).m1();

    t.m2();
    assertEquals("m2", t.getLastMethod());
    verify(m).m2();

    t.m1();
    assertEquals("m1", t.getLastMethod());
    verify(m).m1();

    // TooManyActualInvocations t.m1(): Wanted 1 time, but was 2 times ...
}

public void testValid() {
    I m = mock(I.class);
    T t = new T(m);

    t.m1();
    assertEquals("m1", t.getLastMethod());

    t.m2();
    assertEquals("m2", t.getLastMethod());

    t.m1();
    assertEquals("m1", t.getLastMethod());

    verify(m, times(2)).m1();
    verify(m).m2();
}

一個想法是在最后驗證模擬,但假設有一個小的愚蠢的實現錯誤導致調用方法 m1 兩次和 m2 一次,但不像我在testInvalid中預期的那樣,但最終測試會通過。 我希望我的測試早點失敗。 我如何做到這一點?

謝謝你。

感謝@Woozy Coder:

沒有提到, reset也是一個選項,但由於它必須在驗證和下一個相等的存根調用之間調用,所以我認為很難編寫“好的”和正確的測試。 應該有兩種不同的模擬風格:

  1. “后置條件”嘲笑 Mockito 所做的
  2. “早期”模擬,這將是驗證塊之后的隱式重置

就像是:

earlyReset(m).after(
    new Runnable() {
        t.someMethodInvokingTwoStubs();

        verify(m).someMethod1();
        verify(m).someMethod2();
    }
);

我有一個類似的問題並決定使用clearInvocations() (到達 Mockito 2.1)

https://javadoc.io/static/org.mockito/mockito-core/3.3.3/org/mockito/Mockito.html#clearInvocations-T ...-

使用reset()的缺點是您也會丟失存根, clearInvocations()僅清除調用。

Mockito 的編寫是為了避免脆弱性,這樣驗證就可以使最不具體的斷言成為可能,從而允許實現在不更改測試的情況下發展。 如果多次調用這些方法對您的測試系統無關緊要,那么您不應該要求 Mockito 對其進行檢查。

備擇方案:

  • 使用atLeastatLeastOnce來確保調用完全發生,而不必擔心該方法被調用多少次。
  • 如果調用被存根以具有返回值,則根據關於您已存根的數據的狀態斷言推斷系統可以正常工作。
  • 如果你真的需要存根或驗證行為來改變單個測試方法,你的模擬可能會超出 Mockito 擅長的范圍。 對單個方法使用 Answer,或者編寫一個手動 Fake 來正確模擬互連的方法。

暫無
暫無

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

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