Tenho o seguinte método no qual desejo verificar o comportamento.
public void methodToTest(Exception e, ActionErrors errors) {
...
errors.add("exception.message",
ActionMessageFactory.createErrorMessage(e.toString()));
errors.add("exception.detail",
ActionMessageFactory.createErrorMessage(e.getStackTrace()[0].toString()));
...
}
Na minha classe @Test, eu esperava fazer algo assim para verificar se errors.add()
é chamado com "exception.message" e novamente com "exception.detail"
verify(errors).add(eq("exception.message"), any(ActionError.class));
verify(errors).add(eq("exception.detail"), any(ActionError.class));
no entanto Mockito reclama da seguinte forma
Argument(s) are different! Wanted:
actionErrors.add(
"exception.message",
<any>
);
Actual invocation has different arguments:
actionErrors.add(
"exception.detail",
org.apache.struts.action.ActionError@38063806
);
Como posso dizer ao Mockito para verificar os dois valores?
Mockito.reset()
Respostas:
Leituras adicionais me levaram a tentar usar ArgumentCaptors e os trabalhos a seguir, embora muito mais prolixos do que eu gostaria.
fonte
methodToTest()
exatamente uma vez, portanto, essa resposta verifica se as duas chamadas são feitas juntas. O capturadoList<String> values
que está sendo declarado conterá apenas os dois valores sendo testados e nenhum outro. Você também pode adicionarassertTrue(values.size == 2)
. Se é isso que você quer, eu substituiria as 3 declarações assertTrue por uma única Hamcrest ...assertThat(values, contains("exception.message", "exception.detail"));
methodToTest()
uma vez. É o argumento do métodoActionErrors errors
é chamado internamente duas vezes.Se a ordem de ambas as
add()
chamadas for relevante, você pode usarInOrder
:fonte
errors
argumento:InOrder inOrder = inOrder(errors);
(ver documentos )List
paraSet
e afirme que o conjunto de entradas é igual ao conjunto fornecido pelas capturas de argumento.Experimente algo assim:
fonte
você provavelmente tem um problema no seu código. Porque na verdade você escreve este código:
Observe que a primeira verificação não está uniforme em relação às invocações reais.
Além disso, recomendo que você realmente não zombe de tipos que você não possui, por exemplo, o tipo struts.
[EDIT @Brad]
Depois de executar o código de Brice (acima) em meu IDE, posso ver que usei ActionError em vez de ActionMessage, então é por isso que meu verify () não estava combinando. A mensagem de erro que postei inicialmente estava me enganando, fazendo-me pensar que era o primeiro argumento incompatível. Acontece que foi o segundo argumento.
Então, a resposta à minha pergunta é
fonte
InOrder
.Você pode usar o
Mockito.atLeastOnce()
qual permite que o Mockito passe no teste, mesmo se o mockObject for chamado muitas vezes.fonte
1) Diga a Mokito a expectativa total de ligações.
2) Diga a Mokito quantas vezes cada combinação de parâmetro era esperada.
fonte
De forma semelhante a @ sendon1928, podemos usar:
para ter certeza de que o método foi chamado um número exato de vezes (solução preferível na minha opinião). Depois, podemos ligar
Para ter certeza de que a simulação não foi mais usada em nenhum contexto. Exemplo completo:
fonte