簡體   English   中英

如何驗證未使用 Mockito 調用特定方法?

[英]How to verify that a specific method was not called using Mockito?

如何驗證在對象的依賴項上調用方法?

例如:

public interface Dependency {
    void someMethod();
}

public class Foo {
    public bar(final Dependency d) {
        ...
    }
}

通過 Foo 測試:

public class FooTest {
    @Test
    public void dependencyIsNotCalled() {
        final Foo foo = new Foo(...);
        final Dependency dependency = mock(Dependency.class);
        foo.bar(dependency);
        **// verify here that someMethod was not called??**
    }
}

更有意義:

import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;

// ...

verify(dependency, never()).someMethod();

此功能的文檔在§4“Verifying exact number of invocations / at least x / never” ,而never javadoc 在這里

Mockito.verify方法上使用第二個參數,如下所示:

Mockito.verify(dependency, Mockito.times(0)).someMethod()

首先:您應該始終導入 mockito static,這樣代碼將更具可讀性(和直觀性):

import static org.mockito.Mockito.*;

實際上有很多方法可以實現這一點,但是(可以說)使用

verify(yourMock, times(0)).someMethod();

方法遍布你的測試,當你在其他測試上使用它來斷言一定數量的執行時,如下所示:

verify(yourMock, times(5)).someMethod();

備選方案是:

verify(yourMock, never()).someMethod();

或者 - 當你真的想確保某個模擬對象實際上根本沒有被調用時 - 你可以使用:

verifyZeroInteractions(yourMock)

請注意:不推薦使用 verifyZeroInteractions(Object... mocks)。 從版本 3.0.1 開始。 現在推薦的方法是:

verifyNoInteractions(yourMock)

作為更通用的模式,我傾向於在測試中使用@After塊:

@After
public void after() {
    verifyNoMoreInteractions(<your mock1>, <your mock2>...);
}

然后測試就可以自由驗證只應該調用什么。

此外,我發現我經常忘記檢查“無交互”,后來才發現調用了不應該調用的東西。

所以我發現這個模式對於捕獲所有沒有特別驗證的意外調用很有用。

verifyNoMoreInteractions()verifyZeroInteractions()方法在內部具有相同的實現:

public static transient void verifyNoMoreInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

public static transient void verifyZeroInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

所以我們可以在模擬對象或模擬對象數組上使用它們中的任何一個來檢查沒有使用模擬對象調用任何方法。

作為一個建議,如果你想在語法級別上與行為驅動的開發風格更加一致,那么可以使用BDDMockito

你可以使用:

then(dependency).should(never()).someMethod();

作為等效的替代品:

verify(dependency, never()).someMethod();

暫無
暫無

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

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