1
resposta

Uso do anyString

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?

1 resposta

No Caso você já está usando um mock e por isso ele se perde para usar o anyString por isso ele pede para passar um valor pra string e portanto a string vazia funciona no seu caso.