Na implementação do teste deve_MostraMensagemDeFalha_QuandoFalharEnvioDeLanceParaAPI, quando simulamos a chamada de erro dentro do answer, devemos passar uma String como argumento. Entretanto, se utilizamos o mock ArgumentMatchers.anyString(), obtemos um erro no teste:
Ao passo que se utilizamos a criação de uma String vazia, como propõe o próprio teste, tudo funciona normalmente:
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) {
final RespostaListener<Void> respostaListener = invocation.getArgument(2);
//Isso aqui dá erro
respostaListener.falha(ArgumentMatchers.anyString());
return respostaListener;
}
}).when(client).propoe(any(Lance.class), anyLong(), any(RespostaListener.class));
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) {
final RespostaListener<Void> respostaListener = invocation.getArgument(2);
//Isso aqui funciona
respostaListener.falha("");
return respostaListener;
}
}).when(client).propoe(any(Lance.class), anyLong(), any(RespostaListener.class));
O erro que ocorre é o seguinte:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
0 matchers expected, 1 recorded:
-> at br.com.alura.leilao.api.EnviadorDeLanceTest$1.answer(EnviadorDeLanceTest.java:101)
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
Qual o motivo deste erro ocorrer? o anyString() não deveria ser utilizado justamente para simular situações em que o conteúdo da String não é relevante para o teste? Isso não pode causar vícios de teste?