Diferenças entre testes unitários usando injeção por construtor e por campo
No último texto que publiquei mencionei as vantagens de usar injeção de dependência por construtor. Entre elas estavam algumas relacionadas a criação de testes unitários. Segue o trecho mais relevante sobre o assunto no texto:
Mock é mais fácil e confiável: comparado ao injeção por campo, é mais fácil mockar as dependências em um teste unitário, porque você não precisa de nenhum contexto de mock ou uso de reflection para acessar a dependência dentro da classe. Também não será enganado por estas técnicas. Você apenas instancia a classe e passa as dependências no construtor: simples e fácil de entender.
Algumas pessoas me procuraram e disseram que seria interessante apresentar um exemplo de teste unitário demonstrando esta diferença entre injeção por construtor e por campo. Achei a ideia boa e resolvi fazer este texto!
Primeiro, vou mostrar como fazer um teste unitário usando injeção de dependência por campo no framework Spring, usando Mockito:
Podemos observar neste teste que:
- Temos algumas anotações de mock (
@Mock
e@InjectMocks
) no corpo da classe de teste; - As dependências mockadas são compartilhadas entre os testes;
- Temos que chamar o método
initMocks
antes de executar o teste; - Não temos certeza da quantidade de dependências que a classe PessoaService tem, pois aquelas que não são usadas no teste não precisam estar declaradas na classe PessoaServiceTest com a anotação
@Mock
.
Agora, o mesmo teste usando injeção por construtor:
Podemos observar neste teste que:
- Temos chamadas de métodos estáticos do Mockito no lugar das anotações. O Mockito, inclusive, torna-se menos essencial para o teste, já que não precisamos mais dos recursos de reflection dele para injeção quando comparado ao teste anterior;
- As dependências mockadas ficam isoladas em cada teste;
- Sabemos quantas dependências tem o
PessoaService
ao instanciá-lo.
Por fim, os pontos levantados acima, mais aqueles levantados em meu texto anterior, mostram como os testes unitário com injeção por construtor apresentam-se como mais vantajosos.