argThat
плюс лямбда
саме так ви можете провалити перевірку аргументу:
verify(mock).mymethod(argThat(
(x)->false
));
де
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
argThat
плюс стверджує
вищевказаний тест "скаже" Expected: lambda$... Was: YourClass.toSting...
. Ви можете отримати більш конкретну причину відмови, якщо використовувати твердження в лямбда:
verify(mock).mymethod(argThat( x -> {
assertThat(x).isNotNull();
assertThat(x.description).contains("KEY");
return true;
}));
АЛЕ: ЦЕ ТІЛЬКИ РОБОТИ З 1 МЕТОДИЧНИМ ЗАВДАННЯМ. Якщо перевірений метод називається 2+ разів, мокіто передає всі викликані комбінації кожному верифікатору. Таким чином, mockito очікує, що ваш перевіряючий мовчки повернеться true
за одним із наборів аргументів, та false
(без затвердження винятків) для інших дійсних викликів. Це очікування не є проблемою для 1 виклику методу - він повинен просто повернути справжній 1 раз.
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
Тепер тест говорить: Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
. ПРИМІТКА: Я використовував assertJ
твердження, але саме ви визначаєте, яку структуру тверджень використовувати.
argThat
з кількома аргументами.
Якщо ви використовуєте argThat
, всі аргументи повинні бути забезпечені збігами. Наприклад:
verify(mock).mymethod(eq("VALUE_1"), argThat((x)->false));
// above is correct as eq() is also an argument matcher.
verify(mock).mymethod("VALUE_1", argThat((x)->false));
// above is incorrect; an exceptoin will be thrown, as the fist arg. is given without an argument matcher.
де:
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
eq
матч
найпростіший спосіб перевірити, чи аргумент рівний:
verify(mock).mymethod(eq(expectedValue));
// NOTE: ^ where the parentheses must be closed.
прямий аргумент
якщо порівняння за посиланням прийнятне, продовжуйте:
verify(mock).mymethod(expectedArg);
// NOTE: ^ where the parentheses must be closed.
Першопричина початкового відмови питання була в те місце з paranthes: verify(mock.mymethod...
. Це було неправильно. Право було б:verify(mock).*