Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Quais classes e métodos devo testar e criar mocks?

Estava estudando testes unitários em Java com JUnit e Mockito. Depois de ver alguns cursos sobre isso eu tentei aplicar em um projeto pessoal. Entretanto, chegou um momento que eu criei uma classe utilitária (sem estado e com métodos estáticos) e queria saber se eu deveria "mockar" ela nos testes. Então, após pesquisar na internet cheguei a 3 respostas diferentes com base em diferentes discussões (principalmente esta):

  1. Fazer teste unitário da classe utilitária e "mockar" ela nos outros testes.
  2. Fazer teste unitário da classe utilitária e não "mockar" ela nos outros testes.
  3. Não devemos "mockar" e criar teste unitário para ela pois já está sendo testada em outros testes.

Continuei pesquisando e dizem que criar mocks de métodos estáticos são "bad smells". Entretanto, existem situações que é bom "mockar" (de acordo com as discussões):

  • Quando é fornecido por um código externo e não podemos mudar a sua implementação.
  • Quando o método acessa outros componentes, por exemplo, um banco de dados.
  • Quando o método é demorado, podendo ser por causa do motivo acima.

Minha jornada continuou e encontrei um parágrafo bem interessante em um outro tópico:

"Your unit tests should normally be focused on the observable behaviors in your system. So refactoring a private method into a new "method object" doesn't necessarily mean that you need to introduce a new battery of tests (although you are welcome to do so)."

E também nesse:

"I always remembers one phrase from Ian Cooper 'test things you want to preserve', when you are mocking a static you are stating in our test that do you want to preserve not the functionality, you want to preserve this design with a static method call. Are you sure you want to preserve this?"

Então fiquei pensando: "Devemos criar testes unitários para cada classe e método dos nossos projetos? Por exemplo, factories, classes utilitárias e outros métodos estáticos? E devemos criar mocks para todas as dependências do objeto?"

Gostaria de saber a opinião de vocês sobre isso, podendo também mandar sugestões de leitura/vídeo que eu lerei/verei com bastante prazer :).

1 resposta
solução!

Olá, Kayo! Como vai?

Sua pergunta é bastante relevante e é uma dúvida comum quando estamos lidando com testes unitários.

A resposta para a sua pergunta pode variar dependendo do contexto e da complexidade do código que você está testando. No entanto, aqui estão algumas diretrizes gerais que podem ajudar:

  1. Testar todas as classes e métodos: Idealmente, você deve criar testes unitários para cada classe e método em seu projeto. Isso garante que cada parte do seu código funciona como esperado e ajuda a identificar rapidamente quaisquer problemas ou bugs. No entanto, na prática, pode ser impraticável testar absolutamente tudo, especialmente em projetos maiores. Portanto, é importante priorizar o teste das partes mais críticas do seu código.

  2. Classes utilitárias e métodos estáticos: Classes utilitárias e métodos estáticos geralmente são bons candidatos para testes unitários, pois eles tendem a ter comportamentos bem definidos que são fáceis de testar. No entanto, como você mencionou, "mockar" métodos estáticos pode ser considerado um "bad smell". Isso ocorre porque os métodos estáticos não são facilmente substituíveis, o que pode tornar seus testes mais difíceis de escrever e manter. Portanto, em vez de "mockar" esses métodos, você pode considerar testá-los diretamente.

  3. Mockar dependências: Em geral, é uma boa prática "mockar" todas as dependências externas em seus testes unitários. Isso inclui coisas como bancos de dados, sistemas de arquivos e chamadas de rede. "Mockar" essas dependências permite que você teste seu código de maneira isolada, sem a necessidade de configurar e limpar um ambiente de teste complexo. No entanto, como você mencionou, há situações em que pode não ser apropriado ou necessário "mockar" uma dependência.

Quanto à sua jornada de pesquisa, você está no caminho certo. O parágrafo que você citou sobre focar nos comportamentos observáveis do seu sistema é um bom conselho. Em relação à frase de Ian Cooper, ela nos faz refletir sobre o que realmente queremos preservar em nossos testes.

Sugiro a leitura do livro "Clean Code: A Handbook of Agile Software Craftsmanship" de Robert C. Martin, que tem um capítulo inteiro dedicado a testes unitários e é uma referência na área.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.