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!

Autor

Ismael Soares é Gerente de Engenharia de Software na Bluesoft em São Paulo. É formado em banco de dados pela Faculdade Impacta de Tecnologia e possui mais de 14 anos com experiências em análise e desenvolvimento de sistemas. Já trabalhou com diversas tecnologias, entre elas: VB6, ASP, PHP, C#.NET, VB.NET, ASP.NET, PL/SQL, T-SQL, Groovy, Ruby e Java. Já participou de diversos projetos com banco de dados entre eles: Oracle, MSSQL Server, MySQL e Postgree.

Deixe aqui o seu comentário