No quarto artigo desta série, dei exemplos de como utilizar o dublê Fake Object. Neste artigo, vou demonstrar como usar o dublê Mock Object.
Este é o tipo de dublê mais conhecido pelos desenvolvedores. Isto se dá devido ao fato de Mock Object ser uma espécie de multiuso no que diz respeito a testes de unidade, ou seja, além de verificar as chamadas indiretas e prover os dados necessários para que o teste aconteça (sua função principal), ele ainda consegue reproduzir quase tudo o que os outros dublês fazem, com a vantagem de não precisar de uma implementação real, pois existem diversas ferramentas que já fazem este trabalho duro.
Para exemplificar melhor o uso deste dublê, considere o seguinte exemplo: suponha que um serviço de cadastrar cliente, ao atualizar as informações, precisa persisti-las no banco de dados e notificar o cliente via e-mail que a operação foi realizada com sucesso. No entanto, para realizar tal tarefa, este serviço depende de outros dois:
EmailService e ClienteDao. O primeiro é responsável por enviar o e-mail, e o segundo por gravar os dados. Veja o código que executa esta tarefa na listagem abaixo:
A listagem a seguir ilustra o teste do serviço que atualiza os dados do cliente.
(ClienteService):
O método deveAtualizarOCliente() – linha 16 – assegura que as responsabilidades estão sendo delegadas aos respectivos serviços corretamente utilizando o método verify(), que confirma quantas vezes os comportamentos salvar() de ClienteDao e confirmarCadastro() de EmailService() foram chamados (linhas 25 e 26).
Neste exemplo, além do JUnit4, está sendo utilizado o framework Mockito. Este possui o método mock(), que cria uma implementação falsa do objeto real (linhas 5 e 6). Entretanto, é necessário definir o seu comportamento. Por exemplo, antes de atualizar os dados do cliente, o serviço precisa saber se o mesmo já possui cadastro. Neste caso, quando o método obter() de ClienteDao for chamado, o dublê precisará saber o que retornar. Veja como definir um retorno para o Mock na linha 12. Com esta implementação, é possível determinar o que o método deve prover para a unidade em teste, um cliente.
O dublê Mock só retorna o que foi previamente definido. Da mesma forma, ele só armazena as chamadas de métodos que estão sendo testadas. Por isso, nem sempre ele é a melhor opção, pois torna o código muito repetitivo.
Quer saber mais?
No próximo artigo desta série, veremos as comparações entre os 5 tipos de dublês.
Até breve e bom código!