web-dev-qa-db-ja.com

Mockito:他のメソッドへの呼び出しを無視して、正確なパラメーターでメソッドが1回だけ呼び出されたことを確認する方法は?

JavaでMockitoを使用するメソッドが他のメソッドへの呼び出しを無視して正確なパラメーターで1回だけ呼び出されたことを確認する方法

サンプルコード:

public class MockitoTest {

    interface Foo {
        void add(String str);
        void clear();
    }


    @Test
    public void testAddWasCalledOnceWith1IgnoringAllOtherInvocations() throws Exception {
        // given
        Foo foo = Mockito.mock(Foo.class);

        // when
        foo.add("1"); // call to verify
        foo.add("2"); // !!! don't allow any other calls to add()
        foo.clear();  // calls to other methods should be ignored

        // then
        Mockito.verify(foo, Mockito.times(1)).add("1");
        // TODO: don't allow all other invocations with add() 
        //       but ignore all other calls (i.e. the call to clear())
    }

}

TODO: don't allow all other invocations with add()セクションで何をすべきですか?

すでに失敗しました:

  1. verifyNoMoreInteractions(foo);

いや。 clear()などの他のメソッドの呼び出しは許可しません。

  1. verify(foo, times(0)).add(any());

いや。 add("1")への1回の呼び出しを許可することは考慮されていません。

27
Igor Mukhin
Mockito.verify(foo, Mockito.times(1)).add("1");
Mockito.verify(foo, Mockito.times(1)).add(Mockito.anyString());

最初のverifyは、パラメーター化された予想される呼び出しを確認し、2番目のverifyは、addへの呼び出しが1つしかなかったことを確認します。

50
hunter

前の答えはさらに簡素化できます。

Mockito.verify(foo).add("1");
Mockito.verify(foo).add(Mockito.anyString());

単一のパラメータverifyメソッドは、times(1)implementationの単なるエイリアスです。

7
Travis Miller