argThat
mais lambda
é assim que você pode falhar na verificação do argumento:
verify(mock).mymethod(argThat(
(x)->false
));
Onde
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
argThat
mais afirma
o teste acima "dirá" Expected: lambda$... Was: YourClass.toSting...
. Você pode obter uma causa mais específica da falha se usar declarações no lambda:
verify(mock).mymethod(argThat( x -> {
assertThat(x).isNotNull();
assertThat(x.description).contains("KEY");
return true;
}));
MAS: APENAS FUNCIONA COM 1 CHAMADA DE MÉTODO. Se o método verificado chamar mais de 2 vezes, o mockito passa todas as combinações chamadas para cada verificador. Portanto, o mockito espera que seu verificador retorne silenciosamente true
para um dos argumentos definidos e false
(sem nenhuma exceção de asserção) para outras chamadas válidas. Essa expectativa não é um problema para uma chamada de método - ela deve retornar apenas uma vez verdadeira.
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
Agora o teste diz: Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
. NOTA: Eu usei assertJ
afirmações, mas cabe a você qual estrutura de afirmação usar.
argThat
com vários argumentos.
Se você usar argThat
, todos os argumentos deverão ser fornecidos com correspondências. Por exemplo:
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.
Onde:
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
eq
matcher
a maneira mais fácil de verificar se o argumento é igual:
verify(mock).mymethod(eq(expectedValue));
// NOTE: ^ where the parentheses must be closed.
argumento direto
se a comparação por ref for aceitável, continue com:
verify(mock).mymethod(expectedArg);
// NOTE: ^ where the parentheses must be closed.
A causa da falha pergunta original era o lugar errado das paranthes: verify(mock.mymethod...
. Isso estava errado. O direito seria:verify(mock).*