No terceiro artigo desta série, dei exemplos de como utilizar o dublê Test Spy. Neste artigo, vou demonstrar como usar o dublê Fake Object.
O Fake Object é um tipo de dublê que substitui uma funcionalidade real por uma implementação alternativa, emulando assim o comportamento original com características amigáveis ao cenário testado.
Ele é mais indicado em casos onde o comportamento real seja dependente de serviços externos. No entanto, se torna inviável em situações onde se precisa garantir interações. Isto porque o Fake Object não grava estado e muito menos armazena informações que garantam que ele foi chamado.
Para exemplificar o uso deste dublê, observe o código da Listagem abaixo:

O método cancelar() do serviço NotaFiscalService basicamente grava o usuário que cancelou a nota fiscal. Entretanto, caso o usuário não tenha permissão para cancelar, o sistema deve retornar uma mensagem informando-o sobre o inconveniente. Note que a responsabilidade de saber quem está logado e quais as funções permitidas é do serviço Seguranca. Este, por sua vez, tem uma série de dependências que só estão disponíveis no ambiente de produção, o que significa que seu comportamento precisará ser dublado. Seguindo os mesmos moldes dos dublês anteriores, antes de criar o Fake Object será necessário definir uma interface para o serviço Seguranca.
Nesta interface devem ser criados os métodos usados na unidade de teste. Em seguida, cria-se uma nova classe implementando a interface definida. Observe o código da mesma na Listagem abaixo:

Com o serviço de segurança podendo ser reproduzido em ambiente de teste, ficou fácil testar o cancelamento da nota fiscal. Veja o código da classe de teste na Listagem abaixo:
O método setup() – linhas 7 a 12 – é responsável por instanciar os recursos compartilhados do teste. Note que ao criar o objeto NotaFiscalService (linha 11), está sendo passado por parâmetro o Fake Object para substituir o serviço Seguranca. Em seguida, a partir da linha 14, temos o método de teste deveRetornarUmaMensagemNegandoAPermissao(), que garante que uma mensagem será retornada em forma de exceção caso o usuário não tenha acesso para realizar a operação de cancelamento. Este teste só é possível porque, através do objeto segurancaFake, libera-se ou não a permissão para o usuário, como está sendo feito na linha 16. Já no teste devePermitirQueOUsuarioConfiraAEscritaFiscal(), a permissão é liberada para garantir que o usuário logado seja incluído como cancelador da nota fiscal informada.

Quer saber mais?

No próximo artigo desta série, veremos exemplos de Mock Object.

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