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 передает все вызываемые комбинации каждому верификатору. Таким образом, mockito ожидает, что ваш верификатор молча вернется true
для одного набора аргументов и false
(без исключений assert) для других допустимых вызовов. Это ожидание не является проблемой для 1 вызова метода - оно должно просто возвращать true 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).*