Muchas veces se ha terminado una tarea y se pide que se pruebe el codigo. Que el codigo hay que probarlo es una cosa que se debe de tener en cuenta desde el principio de desarrollo. Un codigo es ”probable” cuando se puede hacer un test unitario para probarlo.
El gran problema de este axioma son las dependencias de otros sistemas. Por ejemplo, supongamos una funcion como la siguientes:
Private ManagerBD daoClientes;
Private ManagerWS webServicesClientes;
Public List buscarClientesValidos (Date inicio, Date fin) {
List todosClientesEntreFechas = daoClientes.buscarClientes (inicio, fin);
List resultado = new ArrayList();
for (Cliente cliente: todosClientesEntreFechas ){
if (webServicesClientes.esValido (cliente))
resultado.add (cliente);
}
return resultado;
}
public void setWebServicesClientes (ManagerWS webServicesClientes){
this. webServicesClientes = webServicesClientes;
}
public void setDaoClientes (ManagerBD daoClientes){
this. daoClientes = daoClientes;
}
El metodo buscarClientesValidos es completamente probable ya que las dependencias a otros sistemas (BD y web services) son facilmente remplazables. En el test solo tendrias que usar los set para cambiar las instancias de ManagerBD y ManagerWS por unas que sean mocks y devuelvan lo que tu quieras.
Pero si por ejemplo tienes en el metodo algo asi
Public List buscarClientesValidos (Date inicio, Date fin) {
List todosClientesEntreFechas = daoClientes.buscarClientes (inicio, fin);
List resultado = new ArrayList();
for (Cliente cliente: todosClientesEntreFechas ){
if (WSInstancia.esValido (cliente))
resultado.add (cliente);
}
return resultado;
}
Es decir, un metodo estatico de una clase que no tienes instanciada a nivel de clase entonces este metodo no es probable. Lo puedes hacer problable sacando la llamada a un metodo
Public List buscarClientesValidos (Date inicio, Date fin) {
List todosClientesEntreFechas = daoClientes.buscarClientes (inicio, fin);
List resultado = new ArrayList();
for (Cliente cliente: todosClientesEntreFechas ){
if (esValido (Cliente cliente))
resultado.add (cliente);
}
return resultado;
}
Public boolean esValido (Cliente cliente){
return WSInstancia.esValido (cliente);
}
Ahora el metodo es probable de nuevo ya que solo tienes que que crear una instancia de la clase y sobreescribir el metodo esValido por un metodo que devuelva lo que tu quieras.
La clave de la validez de las pruebas es que NO HAY QUE TOCAR CODIGO del metodo que estas probando. Si has modificado una linea del codigo, aunque sea lo mas simple del mundo, tienes que volver a problarlo todo.
Otra cosas importante para probar es tener el entorno para probar preparado desde un principio. Es decir, para hacer la prueba de la clase que contenga el metodo buscarClientesValidos tienes que instanciarla y si para ello tienes que pasarle variables de iniciacion compleja entonces tienes que tenerlas preparadas desde el principio de la prueba. No puedes crear un entorno distinto para cada prueba porque perderias mucho tiempo.
Otra cosas importante para probar es tener el entorno para probar preparado desde un principio. Es decir, para hacer la prueba de la clase que contenga el metodo buscarClientesValidos tienes que instanciarla y si para ello tienes que pasarle variables de iniciacion compleja entonces tienes que tenerlas preparadas desde el principio de la prueba. No puedes crear un entorno distinto para cada prueba porque perderias mucho tiempo.