Dherik Barison
Jan 25 · 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.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade