Метод Java verify void вызывает n раз с Mockito

Я пытаюсь проверить, что метод (void) вызывается внутри 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()), я получу ту же ошибку. Мысли по этому поводу?


person nbpeth    schedule 05.01.2015    source источник
comment
Попробуйте _ 1_. Интересно, почему вы переместили вызов метода send() внутрь метода verify. У вас уже был правильный синтаксис.   -  person Tom    schedule 05.01.2015
comment
stackoverflow.com/questions/14889951/   -  person austin wernli    schedule 05.01.2015
comment
Также обратите внимание, что если вам все равно, сколько раз что-то вызывается, вы можете написать verify(mock, atLeastOnce()).send();   -  person Dawood ibn Kareem    schedule 05.01.2015
comment
Спасибо, правильно. Что меня смутило, так это то, что Mockito.verify(mock).send() прошел, но простая инкапсуляция вызвала ошибку, которая ничего не меняет. однако это победа!   -  person nbpeth    schedule 05.01.2015


Ответы (1)


Необходимый метод: 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 раз.


Если вы просто хотите проверить, был ли метод вызван один раз, вам не нужно передавать 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 раз.

person Tom    schedule 05.01.2015
comment
Для тех, кто хочет узнать, где находятся VerificationMode методы (для статического импорта или явной ссылки), они находятся в org.mockito.internal.verification.VerificationModeFactory. - person Steve Chambers; 28.09.2015
comment
verify(mock, atLeast(0)).someMethod("was called any number of times"); было полезно игнорировать подтверждение звонка - person tj-recess; 17.05.2017
comment
есть ли что-то вроде verify(between(m,n)), которое проверяет количество вызовов между m и n? - person nishant; 20.03.2019
comment
@nishant Нет, Mockito, похоже, не поддерживает это, но вы можете вызвать verify to times с atLeast(M) и atMost(n), чтобы получить такое же поведение. Я отредактировал ответ, объяснив это. - person Tom; 25.03.2019
comment
@KevinWelker Вы правы, я удалил информацию о VerificationModeFactory. Он по-прежнему доступен в последней версии, но я согласен с тем, что внутренние классы использовать не следует. - person Tom; 25.03.2019