web-dev-qa-db-ja.com

Mockitoを使用して特定のメソッドが呼び出されなかったことを確認するにはどうすればいいですか?

メソッドがオブジェクトの依存関係に対して not 呼び出されていることを確認するにはどうすればいいですか?

例えば:

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??**
    }
}
496
beluchin

さらにもっと意味がある:

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

// ...

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

この機能のドキュメンテーションはそこにあります §4 "正確な呼び出し回数の確認/少なくともx/never" そしてnever javadocは here です。

867
Brice

次のように、Mockito.verifyメソッドで2番目の引数を使用します。

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

94
beluchin

従うべきより一般的なパターンとして、私はテストで@Afterブロックを使う傾向があります:

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

それから、テストはshouldが呼ばれるべきものだけを自由に検証できます。

また、「やりとりができない」ことを確認するのを忘れたことがよくありますが、それは、本来ならないはずのものが呼び出されていることを後で発見するためだけです。

そのため、このパターンは、特に検証されていないすべての予期しない呼び出しを検出するのに役立ちます。

15
David Lavender

verifyNoMoreInteractions()メソッドとverifyZeroInteracions()メソッドは、内部的に同じ実装を持っています。

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

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

そのため、モックオブジェクトまたはモックオブジェクトの配列でそれらのいずれかを使用して、モックオブジェクトを使用してメソッドが呼び出されていないことを確認できます。

5
Ujjwal