Por supuesto, Kotlin también nos permite hacer test unitarios sobre el código Java de forma muy sencilla, y muy parecida a lo que estamos acostumbrados en Java.

Hay alguna pequeña cosa que se complica cuando utilizamos librerías como Mockito, pero veremos algunos trucos para que sea más sencillo.

Este artículo forma parte de una serie de 30, con motivo del lanzamiento del curso presencial de Kotlin para desarrolladores Android, que impartiré en breve. ¡Apúntate y apréndelo todo sobre el lenguaje del futuro de Android!

kotlin-desarrolladores-android

Tests unitarios en Kotlin

Aunque el tema de lo que es un test unitario siempre genera controversia, no voy a entrar aquí en detalles sobre lo que es o no es un test unitario.

Para nuestro ejemplo en particular, es suficiente pensar que un test unitario es aquel test que no necesita un dispositivo para ejecutarse. El IDE será capaz de ejecutarlos y mostrar un resultado, identificando cuáles se ejecutaron y cuáles fallaron.

Configura Gradle

Necesitas añadir jUnit a tus dependencias. Es posible que cuando creaste el proyecto ya se incluyera por defecto. También vamos a añadir Mockito, pues lo utilizaremos después:

Crea tu primer test

En la carpeta app/src/test (créala si no existe), puedes crear una nueva clase llama MyTest, que tenga la siguiente forma:

Como ves, es muy similar a lo que estás acostumbrado en Java, con la nomenclatura típica de Kotlin.

Cómo usar Mockito

Mockito en Kotlin se puede usar como cualquier otra librería, si bien es cierto que te vas a encontrar con ciertas complicaciones que vas a necesitar solventar.

Aquí tienes un ejemplo extraído del libro:

Como ves, todo es muy similar. Puedes crear tus mocks y utilizarlos sin problemas a lo largo del código. Aunque aquí no lo estoy haciendo, también podrías usar MockitoJUnitRunner y anotaciones.

La palabra when es una palabra reservada en Kotlin, y por eso es necesario usarla con comillas invertidas, o incluso podrías renombrar el import y darle el nombre que quieras:

El problema surge cuando se intentan mockear tipos que no permiten valores nulos. Mockito por defecto lo que hace es dar valores nulos a los objetos que mockea, con lo que tarde o temprando surgirán problemas.

Un pequeño truco es usar alguna librería como mockito-kotlin, que en vez de usar nulos, dará valores por defecto específicos a cada tipo, solventando ese problema. Además, da otras funciones que aprovechan la potencia de Kotlin para hacer las cosas más sencillas.

Otro problema es que, por defecto, todas las clases y funciones en Kotlin son cerradas, lo que quiere decir que no se pueden extender. Esto es un problema para Mockito, pues no es capaz de mockearlas.

La única solución hoy en día es crear interfaces para todo, o hacer open todo lo que queramos mockear. Pero esto va a dejar de ser un problema pronto, pues Mockito 2 permite mockear objetos finales, y aunque aún no tenemos una versión final (actualmente es Release Candidate), ya es perfectamente usable.

En un próximo artículo veremos cómo usarlo.

Una pequeña curiosidad

Kotlin nos permite algo más de flexibilidad que Java al poner nombres a las funciones. Si utilizamos comillas invertidas, podemos poner cualquier texto que se nos ocurra.

Esto puede ser muy útil para los tests, donde lo más importante es que el nombre del test describa perfectamente lo que está haciendo, para que sirva como especificación.

Puedes por tanto tener un test que se llame así:

Lo mejor es que, aparte de leerse mucho mejor el código, también se entiende mejor en el output del resultado cuando falla. Verás el error legible de forma más clara.

Si lo utilizas en un proyecto Android, verás que salta un error de Lint indicando que los métodos en proyectos Android no pueden tener espacios. En mis pruebas no he visto que esto sea un problema. Gradle los ejecuta sin problema, así que puedes añadir una anotación para que ignore el error.

En cualquier caso, recuerda usar esto sólo en los tests.

Conclusión

Aunque teóricamente las herramientas de testing que usamos en Java deberían funcionar sin problemas en Kotlin, bien es cierto que aquellas que se basan en reflexión y añaden nulos al código nos pueden dar problemas.

Kotlin es muy cuidadoso con la nulidad, y esto puede ser una pega en algunos casos. Pero cada vez hay más alternativas para hacerlo de forma sencilla, y con Mockito 2 todos esos problemas tienden a desaparecer.

Aparte de estos pequeños escollos, todo lo demás funciona tal y como se haría en Java.