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!

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