Cuando la unidad prueba funciones de una clase que tiene funciones privadas que requieren funcionalidad en línea. ¿Cómo se podría probar?
Por ejemplo:
public class Foo
{
public int methodA()
{
int val = goOnlineToGetVal();
return val;
}
private int goOnlineToGetVal()
{
CloudService c = new CloudService();
int oval = c.getValueFromService();
return oval;
}
}
Si tuviera que probar la función: 'methodA ()', intentaría usar 'goOnlineToGetVal ()', que a su vez intentaría conectarse en línea, si esta prueba se realizara sin funcionalidad. ¿Cómo obtendría una cobertura de clase del 100% sin estar en línea?
unit-testing
junit
Ben enloquecido Euden
fuente
fuente
Respuestas:
new CloudService()
Y ahí está tu problema.
El diseño moderno de OO recomienda que este tipo de dependencia se transfiera en lugar de construirse directamente. Esto se puede pasar a la función misma o a la clase en el momento de la construcción. También podría ser agarrado o agregado por un contenedor de Inversión de Control si se justifica ese tipo de complejidad.
En ese momento, se vuelve bastante trivial pasar un servicio falso / falso para proporcionarle sus datos "en línea" durante las pruebas. Mejor aún, permite que su software sea lo suficientemente flexible, para que pueda adaptarse rápidamente en caso de que algún cliente (¿gubernamental?) Aparezca y no quiera usar la nube para sus valores. O desea volcar un proveedor de la nube para otro. O...
fuente
Lo implementaría así:
La interfaz
ICloudService
se puede implementar con un simulacro de prueba o con el servicio en la nube "real". Cuando la instanciaciónnew CloudService()
es obligatoria para cada llamada degetValueFromService
, oCloudService
es de una API de terceros que no se puede cambiar, implemente un contenedor, derivandoICloudService
y haciendo las llamadas apropiadas.fuente