Mockito 2: la librería de mocks por excelencia en Java adquiere nuevos poderes

Mockito 2: la librería de mocks por excelencia en Java adquiere nuevos poderes
Sin comentarios Facebook Twitter Flipboard E-mail

Es innegable que Mockito se ha convertido en una librería de referencia para crear Mocks en los tests unitarios escritos en Java y algunos otros lenguajes de la JVM.

Su simplicidad de uso unida a su potencia la han hecho una de las preferidas entre aquellos que quieren escribir tests para validar su software.

Hace algunos meses, el equipo que desarrolla Mockito lanzó por fin la versión final de Mockito 2. Una actualización que ha añadido un buen número de novedades muy interesantes, y que hoy quiero presentarte.

Mockito 2 permite mockear clases y métodos finales

Novedades en Mockito 2

Mockito 2 ha añadido varias funcionalidades realmente útiles, que facilitarán la tarea de escribir tests más sencillos y útiles.

Además, ahora permite crear mocks de algunas cosas que antes eran imposibles.

Aquí te cuento cuáles son las novedades:

Ahora detecta qué mocks no son necesarios

Así es. Cuando un test contenga un mock que no está siendo utilizado, la ejecución fallará. De esta forma nos evitamos crear mocks innecesarios, y los tests se vuelven más legibles.

Si quieres, puedes evitar que esto ocurra utilizando el runner MockitoJUnitRunner.Silent.class, pero la verdad que es algo bastante útil.

Muchas mejoras en los matchers

Con el objetivo de ser más preciso, algunos de los matchers han cambiado su comportamiento.

Por ejemplo, ahora any() no incluye valores nulos. Es una buena forma de detectar dónde estamos siendo demasiado flexibles con nuestras condiciones del test.

Si queremos especificar que queremos un valor nulo para el parámetro, podemos usar el matcher isNull(). Y si queremos un comportamiento similar al antigo, entonces podemos utilizar nullable().

Otro ejemplo es que anyInt() ahora no acepta valores de tipo long. A partir de ahora tendrás que usar anyLong() en esos casos.

Por fin puedes mockear lo "inmockeable"

Mockito 2 permite mockear clases y métodos finales. Esto es una muy buena noticia, ya que podremos evitar que nuestras clases o métodos sean extendidos, y no comprometer nuestro código por el hecho de necesitar testearlo. En el caso de que no se quiera que se use herencia, se debería prohibir, como se indica en el item 17 de Effective Java.

Además, esta feature se vuelve casi imprescindible para otros lenguajes como Kotlin, donde todas sus clases y funciones son cerradas (finales) por defecto.

Esta característica es relativamente experimental, así que para activarla hay que hacer algunos ajustes. Si quieres utilizarlo, en este artículo explico cómo.

Mockito 2 Activacion Clases Finales

Cómo migrar de Mockito a Mockito 2

En muchos casos, esta migración será casi inmediata. Pero es posible que te encuentres problemas, y que algunos de los tests que funcionaban empiecen a fallarte.

Estos son los puntos con los que yo me he encontrado, pero seguro que hay alguno más:

Necesitas modificar el paquete del runner

Si utilizas el runner de Mockito, verás que a partir de ahora te aparecerá como deprecado.

Esto es porque han movido el runner a otro paquete, así que una simple sustitución debería funcionarte:

Este era el antiguo paquete:


import org.mockito.runners.MockitoJUnitRunner;

Y este el nuevo:


import org.mockito.junit.MockitoJUnitRunner;

Actualizar algunos matchers

Como comentaba arriba, los matchers any() ya no validan parámetros null. Yo me encontré con varios de estos, y suelen ser un pequeño olor en los tests, pues indican que están validando cualquier cosa.

El paso de null como parámetro suele ser casi siempre un caso que necesita un tratamiento especial, así que puede ser interesante desdoblar ese tests en dos: uno que use any(), y otro que use isNull().

La alternativa más rápida, sin embargo, es sustituir los any() que fallen por nullable().

Eliminar los stubs innecesarios

Aquí no tendrás mucho problema, porque los errores en los tests te marcarán exactamente qué líneas te sobran.

En alguna ocasión me he encontrado con algún stub que no hacía nada, pero mejoraba la legibilidad. Por ejemplo, mockear un método que devuelve un boolean e indicarle que retorne false.

Aquí ya va en cuestión de gustos. Yo prefiero mantener esta feature activa y evitarme otros que sí que sean innecesarios.

Conclusión

Como ves, Mockito 2 trae muchas novedades que harán tus tests más robustos y sencillos.

Han puesto mucho esfuerzo en solventar todas las carencias de la primera versión, y el resultado es realmente interesante.

Y tú, ¿estás ya usando Mockito 2? ¿Cuáles son las nuevas características que más te están ayudando? La sección de comentarios es tuya.

Comentarios cerrados
Inicio