Dublês de Testes na prática - Dummy Object

Posted by Ismael Soares on November 13, 2014

No primeiro artigo desta série, dei uma breve introdução dos Dublês de Testes (http://rkmael.com/2014/11/13/dubles_testes/). Neste artigo, vou demonstrar como aplicar esta técnica utilizando uma das variações: Dummy Object.

Este tipo de dublê é usado apenas para que a execução do teste seja possível, ou seja, não interage com a unidade testada, mas precisa existir para que o teste seja bem sucedido. A grande vantagem de utilizar este tipo de dublê é não precisar criar uma série de objetos que não serão testados. Observe abaixo.

Dummy1

Neste exemplo, uma Nota Fiscal possui vários itens, e cada item está vinculado a um produto qualquer. Suponha que seja necessário testar o método que adiciona um item na nota e que o construtor da Nota Fiscal exija um Cliente, que precisa ter um Endereço, que precisa ter uma Cidade, que precisa ter um Estado. O objeto Cliente e suas dependências não são alvos do teste, mas sem eles não há como fazê-lo. Veja como ficaria o teste sem usar um dublê:

O Dummy é usado justamente para evitar este tipo de desperdício de código. Um objeto Dummy nada mais é que uma classe parecida com a original, mas sem comportamento. Dessa maneira é possível criar objetos de uma forma mais simples e que não necessitam de ter todas as suas implementações e dependências, como o caso do objeto Cliente, que necessita do objeto Endereco que por sua vez precisa da Cidade e assim por diante. Para que isto, faz-se necessário criar uma interface que será implementada pela classe Cliente e pelo dublê que o substituirá. Veja a interface (InterfaceCliente) e as classes (Cliente e ClienteDummy):

Com a interface sendo implementada pelo Dummy não será necessário criar todas as dependência da codificação real (EnderecoCidade e Estado). Embora ClienteDummy substitua o objeto Cliente, ele não pode de maneira alguma ser chamado ou interagir com o teste. Se isto vier a acontecer, significa que ele não é o tipo de dublê indicado para o cenário em questão e o teste poderá ter um comportamento inesperado. Para garantir que esta interação não irá acontecer, nos métodos de ClienteDummy deve ser incluído um código que lança uma RuntimeException informando que algo de errado aconteceu. Veja como ficou o código de ClienteDummy:

Com o Dummy criado, não faz mais sentido preencher tantos objetos para testar o método adicionaItem() da Nota Fiscal.

Repare que antes era necessário preencher quatro objetos inúteis ao teste (Cliente, Endereco, Cidade e Estado) e todos eles foram substituídos por um Dummy (ClienteDummy).

Quer saber mais?

No próximo artigo desta série, veremos exemplos de Test Stub e Spy.

Até breve e bom código!


comments powered by Disqus