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.