Cómo lidiar con los Singleton en un Test
Hay veces que no nos queda más remedio que tener que lidiar con un Singleton en un Test.
Como sabrás, un Singleton, más que patrón es un antipatrón. Tiene ciertas ventajas y hay ocasiones en las que realmente tiene sentido usarlo. Pero hay muchas veces en las que simplemente tenemos un código legacy que requiere ser testeado y es ahí donde vienen los quebraderos de cabeza.
Offtopic, también tienes algo que sí es un patrón. De diseño de hecho, que es el patrón Strategy. Échale un ojo luego.
Seguimos. 🙂
Una de las cosas que puedes hacer, es tratar de cambiar el código de producción y hacerle un refactor para que sea una class
en lugar de un object
y de este modo, que se cree una nueva instancia en cada test que se ejecute. Ahora… eso probablemente cambie el comportamiento de lo que estaba sucediendo hasta el momento.
Si te has leído el «Working Effectively with Legacy Code», no suele ser buena idea refactorizar algo sin al menos unos test de andamiaje, que sea un refactor que te provea tu IDE, o en última instancia, que estés completamente seguro o segura de lo que estás haciendo.
Si te interesa mejorar tus conocimientos en este campo,
es probable que también te interese el Audiocurso de Modularización en Android o el Audiocurso de Unit Testing en Android.
Dicho esto, como te comentaba, uno de los mayores problemas que tenemos con los Singleton en los tests, es precisamente eso: que es el mismo objeto, la misma instancia, que apunta a la misma dirección de memoria… y si no te lo crees, pon un punto de ruptura y compruébalo por ti mismo. 😄
Bromas aparte, no es que sea un problema de arquitectura. Una de las reglas esenciales de los tests es que estén aislados los unos de los otros. Por lo tanto, si en uno se cambia una variable que se vaya a usar en otro test, al terminar, en el tearDown()
, todo debería volver al estado inicial.
Qué mejor manera de ver esto, que con un sencillo proyecto de ejemplo en Android. Échale un vistazo y así podrás verlo y aplicarlo en tus pruebas:
Estoy pensando en que este episodio del podcast, seguramente también te interese, ya que hablamos sobre testing con legacy code.
Los miembros de Los androides Premium, hacen preguntas (y las responden) como podría ser «cómo testeo un Singleton». ¿Te unes a la tribu?