Esta é uma ótima pergunta! Acho que a causa raiz é a seguinte, estamos usando o JUnit não apenas para testes de unidade. Portanto, a questão deve ser dividida:
- Devo usar o Mockito.verify () em meus testes de integração (ou qualquer outro teste superior à unidade)?
- Devo usar Mockito.verify () no meu teste de unidade de caixa preta?
- Devo usar o Mockito.verify () no meu teste de unidade de caixa branca ?
portanto, se ignorarmos o teste superior à unidade, a pergunta pode ser reformulada "O uso de teste de unidade de caixa branca com o Mockito.verify () cria um ótimo par entre o teste de unidade e a minha implementação, posso fazer " uma caixa cinza " teste de unidade e quais regras básicas eu devo usar para isso ".
Agora, vamos passar por tudo isso passo a passo.
* - Devo usar o Mockito.verify () em meus testes de integração (ou qualquer outro teste superior à unidade)? * Acho que a resposta é claramente não, além disso, você não deve usar zombarias para isso. Seu teste deve estar o mais próximo possível da aplicação real. Você está testando um caso de uso completo, não parte isolada do aplicativo.
* teste de unidade de caixa preta versus caixa branca * Se você estiver usando a abordagem de caixa preta o que realmente está fazendo, fornecerá (todas as classes de equivalência) entrada, um estado e testes para receber a saída esperada. Nesta abordagem, o uso de zombarias em geral é justificado (você apenas imita que eles estão fazendo a coisa certa; você não deseja testá-los), mas chamar Mockito.verify () é supérfluo.
Se você estiver usando a abordagem de caixa branca , o que realmente está fazendo, estará testando o comportamento da sua unidade. Nesta abordagem, chamar Mockito.verify () é essencial, você deve verificar se sua unidade se comporta conforme o esperado.
regras de ouro para o teste da caixa cinza
O problema com o teste da caixa branca é que ele cria um alto acoplamento. Uma solução possível é fazer testes de caixa cinza, não de caixa branca. Esse é um tipo de combinação de testes em caixa preta e branca. Você está realmente testando o comportamento de sua unidade como nos testes de caixa branca, mas, em geral, torna-a independente de implementação, quando possível . Quando for possível, você fará uma verificação como no caso de caixa preta, apenas afirmará que a saída é o que se espera que seja. Portanto, a essência da sua pergunta é quando é possível.
Isso é realmente difícil. Não tenho um bom exemplo, mas posso dar exemplos. No caso mencionado acima com equals () vs equalsIgnoreCase (), você não deve chamar Mockito.verify (), apenas afirmar a saída. Se você não conseguiu, decomponha seu código na unidade menor, até conseguir. Por outro lado, suponha que você tenha algum @Service e esteja gravando o @ Web-Service que é essencialmente wrapper no seu @Service - ele delega todas as chamadas para o @Service (e faz um tratamento extra de erros). Nesse caso, chamar Mockito.verify () é essencial, você não deve duplicar todas as suas verificações feitas no @Serive, verificando se está ligando para o @Service com a lista correta de parâmetros.