![](/img/trans.png)
[英]How to verify invocations of the same mock method with the same argument that changes state between invocations in 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
也是一個選項,但由於它必須在驗證和下一個相等的存根調用之間調用,所以我認為很難編寫“好的”和正確的測試。 應該有兩種不同的模擬風格:
就像是:
earlyReset(m).after(
new Runnable() {
t.someMethodInvokingTwoStubs();
verify(m).someMethod1();
verify(m).someMethod2();
}
);
我有一個類似的問題並決定使用clearInvocations()
(到達 Mockito 2.1)
使用reset()
的缺點是您也會丟失存根, clearInvocations()
僅清除調用。
Mockito 的編寫是為了避免脆弱性,這樣驗證就可以使最不具體的斷言成為可能,從而允許實現在不更改測試的情況下發展。 如果多次調用這些方法對您的測試系統無關緊要,那么您不應該要求 Mockito 對其進行檢查。
備擇方案:
atLeast
或atLeastOnce
來確保調用完全發生,而不必擔心該方法被調用了多少次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.