Download Mocks

Document related concepts
no text concepts found
Transcript
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