Java проверяет void метод вызывает n раз с Mockito

141

Я пытаюсь убедиться, что (Doid) метод вызывается внутри DAO - я использую точку фиксации, которая отправляет список результатов до этой точки, сбрасывает список и продолжает. Скажем, у меня есть 4 вещи в списке, и у меня есть точка фиксации 1, я ожидаю, что метод "send" будет вызван 4 раза. Я могу проверить, что метод вызывается один раз, написав

Mockito.verify(mock).send()

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

Mockito.verify(mock.send(), times(4))

было бы достаточно, но он говорит, что параметры не верны для проверки.

Между прочим, если я перехожу Mockito.verify(mock).send()на Mockito.verify(mock.send())или Mockito.verify((mock).send())я получаю ту же ошибку. Мысли об этом?

nbpeth
источник
10
Попробуй Mockito.verify(mock, times(4)).send(). Интересно, почему вы «переместили» send()вызов метода внутри verifyметода? У вас уже был правильный синтаксис.
Том
Также обратите внимание, что если вам все равно, сколько раз что-то называется, вы можете написатьverify(mock, atLeastOnce()).send();
Дауд ибн Карим
Спасибо, это правильно. Что меня смущало, так это то, что оно Mockito.verify(mock).send()прошло, но просто его инкапсуляция вызвала ошибку, которая ничего не меняет. однако это победа!
nbpeth

Ответы:

238

Необходимым методом является Mockito # verify :

public static <T> T verify(T mock,
                           VerificationMode mode)

mockэто ваш издевательский объект, и modeэто то, VerificationModeчто описывает, как проверять макет. Возможные режимы :

verify(mock, times(5)).someMethod("was called five times");
verify(mock, never()).someMethod("was never called");
verify(mock, atLeastOnce()).someMethod("was called at least once");
verify(mock, atLeast(2)).someMethod("was called at least twice");
verify(mock, atMost(3)).someMethod("was called at most 3 times");
verify(mock, atLeast(0)).someMethod("was called any number of times"); // useful with captors
verify(mock, only()).someMethod("no other method has been called on the mock");

Вам понадобятся эти статические импорты из Mockitoкласса, чтобы использовать verifyметод и эти режимы проверки:

import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

Так что в вашем случае правильный синтаксис будет:

Mockito.verify(mock, times(4)).send()

Это проверяет, что метод sendбыл вызван 4 раза на объекте. Он потерпит неудачу, если он был вызван менее или более 4 раз.


Если вы просто хотите проверить, был ли метод вызван один раз, вам не нужно передавать a VerificationMode. Простой

verify(mock).someMethod("was called once");

было бы достаточно. Это внутренне использует verify(mock, times(1)).someMethod("was called once");.


Можно выполнить несколько проверочных вызовов на одной и той же макете, чтобы добиться проверки «между». Mockito не поддерживает что-то подобное verify(mock, between(4,6)).someMethod("was called between 4 and 6 times");, но мы можем написать

verify(mock, atLeast(4)).someMethod("was called at least four times ...");
verify(mock, atMost(6)).someMethod("... and not more than six times");

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

Том
источник
1
Для тех, кто ищет, где VerificationModeнаходятся методы (для статического импорта или явной ссылки), они находятся в org.mockito.internal.verification.VerificationModeFactory.
Стив Чемберс
verify(mock, atLeast(0)).someMethod("was called any number of times");было полезно игнорировать подтверждение вызова
tj-recess
2
есть что-то вроде того, verify(between(m,n))который проверяет количество звонков между m и n?
nishant
2
@nishant Нет, Mockito , кажется, не поддерживает, но вы можете позвонить verifyв раз с atLeast(M)и atMost(n)получить такое же поведение. Я отредактировал ответ объяснить это.
Том
@KevinWelker Вы правы, я удалил информацию о VerificationModeFactory. Это все еще доступно в самой новой версии, но я согласен, что внутренние классы не должны использоваться.
Том