Как проверить, что конкретный метод не был вызван с помощью 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??
        }
    }

Ответ 2

используйте второй аргумент метода Mockito.verify, как в:

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

Ответ 3

В качестве более общего шаблона я стараюсь использовать блок @After в тесте:

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

Затем тест может свободно проверять только то, что должно быть вызвано.

Кроме того, я обнаружил, что я часто забывал проверять "отсутствие взаимодействия", но только позже обнаружил, что вещи вызываются, которых не должно было быть.

Итак, я нахожу этот шаблон полезным для обнаружения всех неожиданных вызовов, которые специально не были проверены.

Ответ 4

Оба метода verifyNoMoreInteractions() и verifyZeroInteracions() внутренне имеют ту же реализацию, что и:

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

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

поэтому мы можем использовать любой из них на макетном объекте или массиве макетов для проверки того, что методы не были вызваны с использованием макетных объектов.