CWI Software
Published in

CWI Software

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 ( @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.

--

--

--

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.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Dherik Barison

Dherik Barison

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

More from Medium

Monitoring MySQL using Prometheus on kubenetes(Microk8s)

CoreDump: CodeMirror weds HuggingFace API

Post auth RCE based in malicious LUA plugin script upload SCADA controllers located in Russia

The log of github