Как проверить, что метод не вызывает зависимость объекта?
Например:
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??
}
}
Ответ 1
Еще более значимый:
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
// ...
verify(dependency, never()).someMethod();
Документация по этой функции есть §4 "Проверка точного количества вызовов/по крайней мере x/never" и never
javadoc здесь.
Ответ 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);
}
поэтому мы можем использовать любой из них на макетном объекте или массиве макетов для проверки того, что методы не были вызваны с использованием макетных объектов.