Mockito: forzar comportamiento de un método según un argumento utilizado

29 Jul Mockito: forzar comportamiento de un método según un argumento utilizado

Mockito se ha convertido en una herramienta imprescindible dentro de nuestro día a día en la creación de pruebas unitarias. Pero como todas las herramientas, normalmente nos quedamos en la superficie de las posibilidades que la misma ofrece, y uno de las situaciones que veo más veces repetidas es que no pasamos más allá de utilizar los matchers que la librería nos ofrece, como anyString(), anyInt(), eq(), … (ArgumentMatchers).

Pero Mockito nos ofrece la posibilidad de crear Matchers a medida, y en el caso de este post, vamos a intentar explicar la creación de un ArgumentMatcher que nos sirva para generar un escenario concreto en función de los valores que tenga el argumento.

El objeto de este ejemplo es provocar un valor de retorno distinto de un método simulado por Mockito en función de las características de uno de los argumentos

Supongamos que tenemos el siguiente método en la clase Workshop:

El siguiente test demuestra que utilizando los ArgumentMatchers habituales podemos forzar un determinado resultado, independientemente de la lógica del método siempre y cuando le pasemos algún String y algún objeto de tipo Car.

Si miramos el output generado en el log, vemos lo siguiente:

Ahora, nuestro objetivo es que el método nos devuelva un retorno distinto en el caso de que el objeto Car tenga un determinado Color y Brand. Para ello, vamos a generar nuestro propio ArgumentMatcher creando una clase anónima que implemente la clase abstracta ArgumentMatcher:

El test es el siguiente:

La sentencia del when se podría leer así: (when) cuando se invoque al método repair, pasando cualquier string (anyString), y un argumento que coincida (argThat + ArgumentMatcher), devolvemos expectedResult.

En este caso, la output generado en el log es el siguiente:

Como se puede comprobar, en la invocación que nos devuelve secondResult, los atributos del objeto Car coinciden con los esperados por nuestro ArgumentMatcher (implementación del método matches). Si vamos a utilizar este ArgumentMatcher en algún otro test, podemos extraerlo a una clase.

Link al código fuente

 ArgumentMatcher

Marcos Fernández – Arquitecto de Software

 

Sin comentarios

Publicar un comentario

19 − Diez =