Una de las pegas que más se le suele poner a Kotlin, como ya hablábamos en un artículo anterior, es que todas las clases y funciones son por defecto cerradas.

Esto quiere decir que si quieres mockear cualquier clase (algo que puede ser bastante habitual en el testing en Java), necesitas o bien hacerla abierta, con la palabra reservada open, o bien crearte una interfaz por encima.

Ambas opciones pueden ser tediosas, y la verdad es que suponen una limitación cuando la gente viene de programar en Java.

Por suerte, Mockito 2 ha eliminado esta restricción, y hoy te voy a enseñar cómo hacerlo.

Este artículo forma parte de una serie de 30 con motivo del lanzamiento del curso presencial Kotlin para desarrolladores Android, que impartiré muy pronto. ¡Apúntate antes de que te quedes sin plazas!

kotlin-desarrolladores-android

¿Cuál es la problemática?

Imagina que tienes una clase en Kotlin con esta forma:

Y que quieres testear que se llama a su método doSomething.

La forma que tendría el test sería la siguiente:

Si ejecutas esto con una versión de Mockito 1.x, obtendrás el siguiente error:

Mockito cannot mock/spy following:
– final classes
– anonymous classes
– primitive types

Actualiza las dependencias a Mockito 2

Como hemos dicho, Mockito 2 es capaz de mockearlo todo, así que vamos a actualizar la dependencia. En el momento de escribir este artículo la última versión es la 2.2.6. Pero verifícalo porque están actualizando muy a menudo últimamente.

Así que ahora volvemos a ejecutar nuestro código, pero… ¡otra vez falla!

Mockito cannot mock/spy because :
– final class

Ya no nos limita mockear clases anónimas o tipos primitivos, pero sí clases finales ¿A qué se debe esto?

Esta opción aún es un poco experimental, y requiere que la activemos a mano.

Activa la opción de mockear clases finales

Para ello, tendrás que crear un archivo en la carpeta test/resources/mockito-extensions llamado org.mockito.plugins.MockMaker :

mockito-2-activacion-clases-finales

Es un simple archivo de texto, en el que hay que escribir:

Nada más.

Ahora ya puedes ejecutar de nuevo el test, y verás que se ejecuta sin problemas. ¡Genial!

Mockear propiedades

También puedes mockear propiedades sin problema. Si cambiamos el código de la clase a este, por ejemplo:

Ahora vamos a mockear el valor de la property:

Cómo ves, le estoy pidiendo que devuelva 3 cuando se le llame, y posteriormente, compruebo que el valor es el correcto.

También puedes comprobar que una propiedad se ha llamado con:

Conclusión

Como ves, todas las limitaciones han desaparecido gracias a la nueva actualización de la librería de mocks más conocida para Java.

Ya no hay excusa para que no escribas todos tus tests en Kotlin.

Y recuerda que de todo esto y mucho más hablaremos en el curso que impartiré dentro de poco.