Como testear código legado: primer paso

Estoy empezando a leer “Working effectively with Legacy code” de Michael Feather:

Este libro explica muchas técnicas de cómo trabajar con código legado. Si estas teniendo problemas al respecto te recomiendo que lo compres.

Uno de los primeros pasos para poder testear tu código legado sería el romper la dependencia de nuestra código para que podemos añadir test. Porque uno de los mayores problemas con el código legado es que no podemos añadir test.

Ten en cuenta que la definición que tiene el autor de código legado es código sin test.

Uno de los métodos principales para romper la dependencia que tiene el código se llama crear una subclase y sobrescribir  (subclass and override method)

Este método hace que podamos añadir test en código que no es posible. Convierte código en testable.

 

Vamos a verlo con un ejemplo. Tenemos el siguiente código:

Queremos testear el método getUser de la clase UserService pero si creamos un test unitario como el siguiente:

va a fallar porque lanzará una excepción de tipo RuntimeException.

Ten en cuanto que he añadido esta excepción para simplificar el código. Imaginad que en vez de ser esta excepción accede a una base datos que no podemos acceder desde nuestro ordenador o a internet o al sistema de fichero.

 

Si vemos atentamente el código el origen del problema es que tenemos una dependencia con UserConfigurationService que en vez de estar inyectada (ser parte de los atributos de UserService) se crea por una clase que se llama Factory.

Lo que vamos a hacer es crear un método que contenga la instanciación de UserConfigurationService que tendrá el “scope” protected para que las subclases puedan sobreescribirla.

y en el test vamos a crear una instancia hija de UserService que sobreescriba ese método y que devuelva un mock:

Al poder inyectar el mock podemos hacer que el código cambie su comportamiento sin que toquemos su código. Es lo que Michael Feather llama seam. Lo que estamos haciendo con este método es añadir un seam a nuestro código.

Como has podido ver este método es simple pero muy potente porque en muchas casos vamos a poder utilizarlo para poder añadir dobles de test.

No siempre es bueno o posible el poder utilizar este método de romper las dependencias de tu código pero mi experiencia me dice que en la mayoría de los casos es la mejor opción.