Dublês de Testes na prática - Test Stub

Posted by Ismael Soares on November 13, 2014

No segundo artigo desta série, dei um exemplo de como utilizar o dublê Dummy Object. Neste artigo, vou demonstrar como usar o dublê Test Stub.

Este tipo de dublê permite controlar as entradas indiretas da unidade testada, fornecendo dados que poderiam ser difíceis de serem obtidos com o comportamento do objeto real.

O Test Stub funciona como uma espécie de secretária eletrônica. Não decide nada, apenas provê os dados (informações pré-configuradas) para que o cenário de teste possa ser executado.

É muito comum em grandes projetos de software criar classes utilitárias para evitar repetições desnecessárias. Suponha que uma delas seja utilizada para tratamento de data e hora e que tenha um método que retorna a hora atual por extenso. Observe um exemplo na código abaixo.

Testar este método será um desafio interessante. Considere que é preciso dizer ao código que horas são no momento. Neste caso, o Test Stub pode auxiliar na criação do teste substituindo o objeto Calendar.

Criando um Test Stub

Para exemplificar o uso de um Stub, testaremos o método horaAtualPorExtenso(). Para que isto seja possível, adicionaremos um construtor na classe DateUtil que receberá o dublê no lugar do objeto Calendar.

O código responsável por este teste pode ser observado no código abaixo, onde criamos uma instância do objeto Calendar determinando a hora atual desejada (linhas 24 a 27). Desta forma, as mensagens de retorno poderão ser validadas.

Criando um Test Stub Sabotador

O Test Stub tem outra variação bastante interessante conhecida como Sabotador. O nome define exatamente o que este tipo de dublê faz: sabota o comportamento natural do código para que seja possível testar as exceções. Para entender melhor a utilidade do Sabotador, observe o código abaixo:

O método alvo do teste, lerInformacao(), recebe um objeto Reader e processa suas informações escrevendo o resultado no console. Caso ocorra algum erro durante esta leitura, o sistema deverá lançar uma exceção. É neste ponto que entra o Sabotador. Ele causará propositadamente uma IOException para que este comportamento seja testado.

A código a seguir mostra como ficou o teste utilizando o Sabotador:

Note que o comportamento do método read() foi atualizado para lançar uma exceção. Em seguida, o objeto Reader é passado como parâmetro no método lerInformacao(), e por fim, verifica-se a mensagem contida na exceção.

Quer saber mais?

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

Até breve e bom código!


comments powered by Disqus