Testes em algoritmo complexo de cálculo

4 respostas Resolvido
gRoOve

Bom dia, desenvolvi para um cliente um algoritmo complexo de cálculo composto de diversas classes e métodos, afim de elucidar/organizar o algoritmo fui desenvolvendo o cálculo por partes e já fazendo testes unitários.

Ocorre que muitos métodos deste algoritmo são privados, ou seja, eles compõem outros métodos públicos que forma a interface do algoritmo. Como testei estes métodos precisei alterar a visibilidade deles para público, o que está errado ao meu ver.

Como vocês tratam estas situações? Pois pelo que sei métodos privados não devem ser testados, somente as interfaces públicas, porém neste caso os testes unitários foram de grande importância pra eu resolver o algoritmo por partes.

4 Respostas

PedreiroDeSoftware

Sendo em java, vc pode usar reflection.

https://www.tutorialspoint.com/Can-private-methods-of-a-class-be-accessed-from-outside-of-a-class-in-Java

javaflex

Se é importante pra voce fazer isso, vai pelo simples, deixa público, não tem nenhuma lei federal que vai te impedir disso.

gRoOve
Solucao aceita

@PedreiroDeSoftware acho que reflection não seria uma boa abordagem pra fazer isso, obrigado pela dica.

@javaflex seria uma opção também, mas estaria expondo métodos que não fazem parte da API.

Acabei resolvendo da seguinte forma: criei uma Interface com os métodos da API e trabalhei somente com ela, a classe com algoritmo de cálculo ficou com os métodos públicos para os testes, porém ninguém conseguirá vê-los devido ao encapsulamento da inteface.

PedreiroDeSoftware

Quais os fundamentos dessa conclusão?

Tive a necessidade de testar métodos e atributos privados e a reflexão atendeu de forma plena.
A única justificativa para a não utilização é a comodidade ou o desconhecimento sobre reflexão.

As interfaces são para comportamentos semelhantes, há outras classes que se beneficiem dessa interface?

Caso não, é apenas outra comodidade, logo uma aplicação inapropriada da orientação a objetos.

Comodidade por comodidade bastaria apenas deixar os métodos públicos.

Vc marcou a classe original como final?
Pois em uma herança hipotética o método pode ser sobrescrito.

O objetivo do encapsulamento não é esconder a implementação é confiar na implementação e não permitir que está seja alterada, pois isso visa garantir a consistência do sistema.

Assim, em uma eventual herança métodos públicos podem ser sobrescritos logo vc está trocando consistência por comodidade o que não é ruim, mas sim um risco assumido, às vezes necessário por ser corrigível.

Há em alguns grupos a idéia de que otimização prematura é ruim, assim como refatoração prematura também.

E isso justifica a aplicação da comodidade para futura correção o que é bom pois software funcionando é a medida do desenvolvimento e isso coaduna com a comodidade desde que com ciência dos riscos (ínfimo, médio, grande).

Criado 20 de fevereiro de 2020
Ultima resposta 6 de mar. de 2020
Respostas 4
Participantes 3