Java перевіряє недійсні виклики методу n разів за допомогою Mockito


140

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

Mockito.verify(mock).send()

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

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

Було б достатньо, але він говорить, що параметри не є правильними для перевірки.

Між іншим, якщо я перейду Mockito.verify(mock).send()на Mockito.verify(mock.send())або Mockito.verify((mock).send())я отримаю ту саму помилку. Думки про це?


10
Спробуйте Mockito.verify(mock, times(4)).send(). Цікаво, чому ви "перемістили" send()виклик методу всередині verifyметоду. Ви вже мали правильний синтаксис.
Том


Також зауважте, що якщо вам все одно, скільки разів щось називається, ви можете написатиverify(mock, atLeastOnce()).send();
Dawood ibn Kareem

Дякую, це правильно. Що мене збентежило, це те, що Mockito.verify(mock).send()пройшло, але просто його інкапсуляція спричинила помилку, яка нічого не змінює. проте це виграш!
nbpeth

Відповіді:


237

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


1
Для всіх, хто хоче знайти VerificationModeметоди, де знаходяться методи (для статичного імпорту або явного посилання), вони є org.mockito.internal.verification.VerificationModeFactory.
Стів Чемберс

verify(mock, atLeast(0)).someMethod("was called any number of times");було корисно ігнорувати перевірку дзвінків
-перерва

2
чи є щось подібне, verify(between(m,n))яке перевіряє кількість дзвінків між m і n?
нишант

2
@nishant Ні, Mockito, схоже, не підтримує цього, але ви можете зателефонувати verifyдо часу atLeast(M)та atMost(n)отримати таку саму поведінку. Я відредагував відповідь, поясніть це.
Том

@KevinWelker Ви праві, я видалив інформацію про VerificationModeFactory. Він все ще доступний в новітній версії, але я згоден, що внутрішні класи не слід використовувати.
Том
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.