Mockito: Как проверить метод был вызван только один раз с точными параметрами, игнорируя вызовы других методов?

Использование Mockito в Java, как проверить метод, вызывается только один раз с точными параметрами, игнорируя вызовы других методов?

Пример кода:

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()?

Уже безуспешно пытался:

  • verifyNoMoreInteractions(foo);

Неа. Он не разрешает вызовы другим методам, например clear().

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

Неа. Он не учитывает, что мы разрешаем один вызов add("1").

Ответы

Ответ 1

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

Первый verify проверяет ожидаемый параметризованный вызов, а второй verify проверяет, что существует только один вызов add.

Ответ 2

Предыдущий ответ можно упростить еще дальше.

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

Единственный параметр verify - это просто псевдоним реализации times(1).