Mocks
Transcripción
Mocks
BETA Sacándole Partido a JUnit Mocking www.iwt2.org [email protected] 03. Mocking • Aprender qué es el mocking y para qué sirve. • Desarrollar el tipo de pruebas en las que es necesario un mock. • Conocer librerías ya existentes para facilitar el desarrollo de mockings Objetivos 2 Mocking 1. Introducción al Mocking 2. Mocks a mano 3. Librerías de Mocking. 4. Ejemplo con Mockito. 5. Ejemplo con jMock 6. Para finalizar Índice 3 Introducción al Mocking 4 Todo sobre los Mocks • Las clases y objetos mock son la solución a un problema. • El problema es: ¿cómo podemos hacer pruebas / implementar un método que depende de otras clases que puede que aún no estén escritas ni probadas? • La solución es desarrollar falsos objetos de falsas clases que simulen el mínimo comportamiento posible para poder probar / confiar Todo sobre Mocks ¿Cómo probaríamos este método? Self User Pedido Descontar Descuentos Database Todo sobre Mocks • Los mocks también permiten escribir pruebas que verifiquen un comportamiento en vez de un resultado esperado. ¿Cómo escribimos un conjunto de pruebas que verifique que se invoca el método correcto para cada valor de entrada? Todo sobre Mocks • Ten cuidado de no probar mocks. • Si escribes un caso de prueba en el que verificas un resultado devuelto por un mock (en vez de verificar el código bajo prueba o los métodos de un mock fueron llamados), está probando un mock, no tu código real. 8 Todo sobre Mocks Glosario Stub Dummy Objetos que devuelven valores predefinidos al llamar a sus métodos. Objeto que necesita el código bajo prueba pero que nunca será utilizado Fake Objeto que implementa un atajo y o es válido para producción. Spy Objetos que indican las llamadas que han recibido sus métodos. 9 Todo sobre Mocks Glosario Double Este término se utiliza de manera más genérica que el término mock. Por ejemplo: • Un stub de represente un acceso a una BDDD sería un objeto que siempre devolverá valores prefijados • Un fake será un objeto que guarda los valores en un map (por ejemplo) Todo sobre Mocks Ejemplos de mocks en plataforma de desarrollos https://developers.google.com/appengine/docs/java/tools/localunittesting http://developer.android.com/tools/testing/index.html Mocks a mano 12 Mocks a mano • Vamos a ver un ejemplo de cómo escribir pruebas de integración y cómo crear mocks. • Vamos a escribir una prueba que verifique que determinados métodos se han llamado durante la prueba. Mocks a mano • Retomemos el código de ejemplo que hemos visto antes. ¿Cómo escribimos un conjunto de pruebas que verifique que se invoca el método correcto para cada valor de entrada? Mocks a mano • Primero escribiremos el caso de prueba tal y como nos gustaría. • Ahora hacemos que se pueda ejecutar, creando un mock. Caso de prueba Mocks a mano • Para crear el mock seguiremos los siguientes pasos. 1. Convertir todas las referencias a clases en referencias a interfaces. 2. Añadir métodos / constructores para que las referencias a los objetos que implementan en las interfaces vengan de fuera. 3. Hacer implementaciones muy básicas de las interfaces como clases mock 4. Por cada método que queremos comprobar creamos una atributo booleano y un método isX() para conocer su valor. 5. En el constructor inicializamos otros los atributos anteriores a false Mocks a mano Hacemos la dependencia explícita para poder pasarle el objeto adecuado (real o de prueba) y cambiamos la referencia a clase por referencia a interfaz Mocks a mano • A continuación implementamos la interfaz en un objeto mock que no tiene lógica de negocio. • El objeto simplemente se encarga de recordar si un método ha sido llamado o no. La prueba se ejecuta con éxito 18 Mocks a Mano • ¿Cómo podríamos verificar que un método se ha llamado un número concreto de veces? • Explique una posible solución a partir del ejemplo que hemos visto. Ejercicios adicionales. 19 Mocks a mano • Esta solución es válida pero requiere mucho trabajo 1. Hemos de implementar y mantener código para cada interfaz. 2. Hemos de implementar valores devueltos en aquellos métodos que devuelvan algo 3. Hemos de implementar comprobantes para verificar que los parámetros son los esperados en los métodos que tengan parámetros. 4. Etc. A continuación veremos herramientas que hacen todo este trabajo por nosotros. Librerías de mocking 21 Librerías de Mocking En Java http://code.google.com/p/mockito/ http://www.jmock.org/index.html Puedes elegir. Librerías de Mocking Mockito también está implementado en estos lenguajes: • • • • • • Python. JavaScript Scala. Object-C PERL PHP 23 Librerías de Mocking • ¿Conoces algún otro lenguaje de programación? • Busca alguna librería de mocks, adapta alguno de los ejemplos anteriores y compártelo en el foro. Ejercicios adicionales. 24 Ejemplo con Mockito 25 Ejemplo con Mockito • A continuación vamos a ver este ejemplo. • En este ejemplo vamos a verificar el correcto comportamiento del método checkWeb. • Todo lo demás son interfaces por lo que podremos crear distintos mocks e indicarles el comportamiento esperado cuando se invoquen los métodos. Código bajo prueba Ejemplo con Mockito • Los pasos que vamos a dar para escribir una prueba son: 1. 2. 3. Crearemos un mock para cada una de las 4 interfaces (Logger, Server, Web y Result). Configuramos el mock de Server para que espere una llamada al método connect pasándole el mock de la interfaz Web como parámetro y devuelva el mock de la interfaz Result. Hacemos lo mismo con el método isOk para que devuelva true. Ejemplo con Mockito • Con los pasos anteriores, ya hemos creado todos los mocks necesarios. Ahora es el momento de escribir la prueba: 3. Creamos el objeto de la clase WebVerificador. 4. Llamamos al método bajo prueba checkWeb. 5. Comprobamos que el método registerWebIsOk se ha llamado. Ejemplo con Mockito La prueba completa con Mockito quedaría así: Ejemplo con jMock 30 Ejemplo con jMock • A continuación vamos a ver el mismo ejemplo que hicimos con Mockito. • Los pasos a dar serán los mismos pero los implementaremos de manera distinta utilizando jMock. Código bajo prueba Ejemplo con jMock • En general, los pasos que damos al utilizar la herramienta jMock son. 1. Declaramos un contexto para la prueba. 2. Creamos los mocks dentro del contexto. 3. Creamos las expectativas (el comportamiento que esperamos de los mocks). 4. Ejecutamos el código bajo prueba. 5. Comprobamos si se han cumplido todas las expectativas. Ejemplo con jMock • Veamos los pasos en el código: 0. Creamos un contexto. 1. Creamos los mocks dentro del contexto a partir de las interfaces. 2. Definimos las llamadas que esperan los mocks y los valores devueltos (si los hubiera). Ejemplo con jMock 3. Creamos el objeto de la clase bajo prueba e invocamos el método bajo prueba. 4. Verificamos que todo el comportamiento indicado en el context se ha cumplido Ejemplo con jMock • Nota técnica. – JMock trae sus propias librerías Harmcrest las cuáles pueden causar conflicto con Junit 4. – Si al trabajar con jMock obtienes un mensaje de error como el del cuadro e abajo, modifica tu build path para que Junit se cargue en último lugar o bien haz las pruebas en Junit 3. java.lang.SecurityException: class "org.hamcrest.TypeSafeMatcher"'s signer information does not match signer information of other classes in the same package at java.lang.ClassLoader.checkCerts(Unknown Source)…. Ejemplo con jMock • A continuación, tienes la prueba en jMock con el código fuente equivalente en Mockito como comentario, para que puedas comprobar ambas soluciones. Ejemplo jMock vs Mockito Para finalizar 38 Ejemplos en la Web Ejemplo URL Ejemplo con mockito en español http://www.adictosaltrabajo.com/tutoriales/tutoriale s.php?pagina=mockitoExample Ejemplos con mockito en Java https://sites.google.com/a/pintailconsultingllc.com/ja va/mockito-examples Otro ejemplo con Java http://gojko.net/2009/10/23/mockito-in-six-easyexamples/ Dos ejemplos de Mocks en Python (con Mockito y MagicMock) http://iwt2javierj.tumblr.com/post/36695988608/mocks-enpython-previa-python-tdd 39 Actividades • El capítulo 5 muestra un ejemplo sobre mocking. • Este ejemplo está escrito en C# • Consúltalo y decide si habrías tomado las mismas decisiones si fueras tú quien escribiera el ejemplo. Ejercicios adicionales. 40 Para Finalizar Errores habituales utilizando mocks. • • • http://blakesmith.me/2012/02/29/teststubbing-as-an-antipattern.html http://stackoverflow.com/questions/707537 5/is-mockery-a-tdd-anti-pattern http://fabiopereira.me/blog/2010/05/27/ttd d-tautological-test-driven-development-antipattern/ Enlaces y Referencias 41