Как проверить, что метод не вызывается на зависимости объекта?
Например:
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??**
}
}
never
- лучший и самый специфический способ, но если вам нужно проверить весь фиктивный объект, также рассмотритеverifyZeroInteractions(mockObject)
илиverifyNoMoreInteractions(mockObject)
.verifyZeroInteractions
устарела.verifyNoInteractions
это предложенная альтернатива. Версия Mockito во время этого комментария является 3.3.3используйте второй аргумент
Mockito.verify
метода, как в:verify(dependency, Mockito.times(0)).someMethod()
источник
never()
не является значительно более читабельным, чемtimes(0)
. Но существованиеnever
действительно увеличивает когнитивную нагрузку и делает систему мокито более сложной для понимания и запоминания того, как ее использовать. Так что действительно mockito не должен был быть включенnever
в их API, это не стоит ментальных затрат.someMethod
была вызвана 0 раз, или она только проверяет, чтоsomeMethod
она никогда не вызывалась с нулевыми аргументами?someMethod
с нулевыми аргументами вызывается ноль раз - не провереноВ качестве более общей схемы, которой я должен следовать, я склонен использовать
@After
блок в тесте:Тогда тест свободен, чтобы проверить только то, что следует назвать.
Кроме того, я обнаружил, что часто забывал проверять «нет взаимодействий», только чтобы потом обнаружить, что называются вещи, которых не должно было быть.
Поэтому я считаю этот шаблон полезным для перехвата всех неожиданных вызовов, которые не были специально проверены.
источник
verifyNoMoreInteractions
? Другие ответы здесь основаны на том, что автор теста явно не помнит перечислить эти проверки: это слишком часто встречается в моей книге.Прежде всего: вы всегда должны импортировать mockito static, таким образом код будет намного более читабельным (и интуитивно понятным):
Есть на самом деле много способов добиться этого, однако (возможно) более чисто использовать
метод во всех ваших тестах, когда в других тестах вы используете его для подтверждения определенного количества выполнений, подобных этому:
Альтернативы:
В качестве альтернативы - когда вы действительно хотите убедиться, что некий вызываемый объект на самом деле НЕ вызывается вообще - вы можете использовать:
источник
И метод,
verifyNoMoreInteractions()
иverifyZeroInteractions()
метод внутренне имеют ту же реализацию, что и:поэтому мы можем использовать любой из них для фиктивного объекта или массива фиктивных объектов, чтобы проверить, что никакие методы не были вызваны с использованием фиктивных объектов.
источник