Diferenças entre testes unitários usando injeção por construtor e por campo

Dherik Barison
Jan 25, 2019 · 2 min read

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 ( @Mocke @InjectMocks) no corpo da classe de teste;
  • As dependências mockadas são compartilhadas entre os testes;
  • Temos que chamar o métodoinitMocksantes 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.

CWI Software

Desenvolvemos soluções e sistemas de TI com base nas necessidades específicas de empresa de médio e grande porte em âmbito global, desde 1991.

Dherik Barison

Written by

Java developer, Tech Lead, Stack Overflow enthusiast and contributor: https://dherik.com

CWI Software

Desenvolvemos soluções e sistemas de TI com base nas necessidades específicas de empresa de médio e grande porte em âmbito global, desde 1991.