Estoy trabajando en un proyecto donde las llamadas internas de clase son habituales, pero los resultados son muchas veces valores simples. Ejemplo ( código no real ):
public boolean findError(Set<Thing1> set1, Set<Thing2> set2) {
if (!checkFirstCondition(set1, set2)) {
return false;
}
if (!checkSecondCondition(set1, set2)) {
return false;
}
return true;
}
Escribir pruebas unitarias para este tipo de código es realmente difícil, ya que solo quiero probar el sistema de condiciones y no la implementación de las condiciones reales. (Lo hago en pruebas separadas). De hecho, sería mejor si aprobara las funciones que implementan las condiciones y en las pruebas simplemente proporciono alguna simulación. El problema con este enfoque es el ruido: utilizamos mucho los genéricos .
Una solución de trabajo; sin embargo, es hacer que el objeto probado sea un espía y simular las llamadas a las funciones internas.
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
La preocupación aquí es que la implementación del SUT se cambia efectivamente y puede ser problemático mantener las pruebas sincronizadas con la implementación. ¿Es esto cierto? ¿Existe la mejor práctica para evitar este caos de las llamadas a métodos internos?
Tenga en cuenta que estamos hablando de partes de un algoritmo, por lo que dividirlo en varias clases puede no ser una decisión deseada.