Mockito
Mockito
1. Desarrollo de componentes y
proyectos a medida
2. Auditora de cdigo y recomendaciones de mejora
3. Arranque de proyectos basados en nuevas
tecnologas
1. Definicin de frameworks corporativos.
2. Transferencia de conocimiento de nuevas arquitecturas.
3. Soporte al arranque de proyectos.
4. Auditora preventiva peridica de calidad.
5. Revisin previa a la certificacin de proyectos.
6. Extensin de capacidad de equipos de calidad.
7. Identificacin de problemas en produccin.
3a
RFP
Gran Empresa
Concurso
Verificacin
previa
Consultora 1
Tecnologa
Desarrollo
Sistemas
Produccin
Consultora 2
Piloto
3b
Certificacin
o Pruebas
Consultora 3
autentia
Control de autenticacin y
acceso (Spring Security)
UDDI
Web Services
Rest Services
Social SSO
SSO (Cas)
JPA-Hibernate, MyBatis
Motor de bsqueda empresarial (Solr)
ETL (Talend)
Direccin de Proyectos Informticos.
Metodologas giles
Patrones de diseo
TDD
Quienes somos
Tutoriales
Formacin
Colabora
Comunidad
Comic
Charlas
Ms
Catlogo de
servicios
Autentia (PDF
6,2MB)
En formato comic...
[NUEVO!] 2008-12-01
2008-11-17
2008-09-01
2008-07-31
Estamos escribiendo un libro sobre la profesin informtica y estas vietas formarn parte de l. Puedes opinar en la seccion comic.
i www.adictosaltrabajo.com
j
k
l
m
n
Buscar
ltimos tutoriales
Consultor
desarrollo
informticos.
j Web
k
l
m
n
2009-01-29
Ingeniero en Informtica *
2009-01-29
StrutsTestCase
Catlogo de cursos
2009-01-28
Mockito
Introduccin
Verificar el comportamiento
Stubbing
Argument matchers
Verficiando el numero exacto de invocaciones, al menos X, o ninguna invocacin
Stubbing metodos void methods con excepciones
Verificaciones en orden
Asegurandonos que alguna(s) interaccion(es) nunca ocurren en un mock
Buscando llamadas redundantes
@Mock
Conclusiones
Introduccin
Muchos de vosotros conoceris TDD (Test Drive development), desarrollo conducido por pruebas, donde la fuerza de nuestros
programas se basa justo en eso, en los test de las clases que vamos generando (De hecho TDD propone generar los test antes de
crear el cdigo de la clase).
Para poder crear un buen conjunto de pruebas unitarias, es necasario que nos centremos exclusivamente en la clase a testear,
simulando el funcionamiento de las capas inferiores (pensad por ejemplo en olvidarnos de la capa de acceso a datos, DAO). De esta
manera estaremos creando test unitarios potentes que os permitira detectar y solucionar los errores que tengis o que se cometan
durante el futuro del desarrollo de vuestra aplicacin.
Para esta tarea nos apoyaremos en el uso de mock objects, que no son ms que objetos que simulan parte del comportamiento de
una clase, y ms especificamente vamos a ver una herramienta que permite generar mock objects dinmicos, mockito.
Mockito est basado en EasyMock, y el funcionamiento es prcticamente parecido, aunque mejora el api a nivel sintctico, hacindolo
ms entendible para nosotros (no existe el concepto de expected, para aquellos que sepis algo de EasyMock), y adems permite
crear mocks de clases concretas (y no slo de interfaces).
La idea de las pruebas al usar mockito es el concepto de stubbing - ejecutar - verificar (programar un comportamiento, ejecutar las
llamadas y verificar las llamadas), donde centraremos nuestros esfuerzos, no en los resultados obtenidos por los mtodos a probar (o
al menos no solo en ello), si no en las interacciones de las clases a probar y las clases de apoyo, de las cuales generamos mocks.
Vamos a ver el funcionamiento de mockito con diferentes ejemplos para asi apreciar la funcionalidad y potencial de este tipo de
herramientas.
Los siguientes ejemplos van a realizar mocks sobre listas (List), simplemente porque la interfaz List es muy conocida y asi se facilita
la comprensin de dichos fragmentos de cdigo. Quizs los ejemplos parezcan demasiado simples o incluso poco lgicos, pero slo los
2009-01-27
2009-01-25
Aprendiendo XMLSchema a
travs de ejemplos
2009-01-20
2009-01-19
2009-01-18
ltimas ofertas de
empleo
2008-12-22
Recomiendo finalmente que os leis las conclusiones para aclararos posibles dudas.
Verificar el comportamiento
Una vez realizadas las llamadas necesarias al objecto que estamos probando mediante mocks, vamos a comprobar que las
iteraciones se han realizado correctamente:
view plain
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
2008-10-30
//creacion de mock
List mockedList = mock(List.class);
2008-10-30
T. Informacin - Analista /
Programador - BARCELONA.
mockedList.add("one");
mockedList.clear();
2008-10-27
//verificacion
verify(mockedList).add("one");
verify(mockedList).clear();
T. Informacin - Analista /
Programador - CIUDAD REAL.
Una vez creado, el mock recuerda todas las interacciones. Se puede elegir indiferentemente que interaccin verificar
Anuncios Google
Stubbing
Tambin podemos programar el comportamiento de los mocks, indicando qu deben devolver ciertos mtodos.
view plain
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
//stubbing
when(mockedList.get(0)).thenReturn("first");
when(mockedList.get(1)).thenThrow(new RuntimeException());
//imprime "first"
System.out.println(mockedList.get(0));
Por defecto todos los mtodos que devuelven valores de un mock devuelven null, una coleccin vaca o el tipo de dato primitivo
apropiado.
Argument matchers
Los arguments matchers permiten realizar llamadas a mtodos mediante 'comodines', de forma que los prametros a los mismos no
se tengan que definir explcitamente:
view plain
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
//stubbing usando hamcrest (libreria de matchers) (digamos que isValid() devuelve tu propio matcher):
when(mockedList.contains(argThat(isValid()))).thenReturn("element");
//imprime "element"
System.out.println(mockedList.get(999));
Argument matchers permiten realizar stubbing o verificaciones muy flexibles. podis ver mas en
http://mockito.googlecode.com/svn/branches/1.7/javadoc/org/mockito/Matchers.html
view plain
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
//usando mock
mockedList.add("once");
mockedList.add("twice");
mockedList.add("twice");
mockedList.add("three times");
mockedList.add("three times");
mockedList.add("three times");
//las dos verificaciones siguientes trabajan de la misma manera (times(1) se usa por defecto)
verify(mockedList).add("once");
verify(mockedList, times(1)).add("once");
01.
02.
03.
04.
doThrow(new RuntimeException()).when(mockedList).clear();
Verificaciones en orden
Si necesitamos que varios mock necesiten llevar un orden especfico en las llamadas lo podemos realizar de la siguiente manera:
view plain
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
//usando mocks
firstMock.add("was called first");
secondMock.add("was called second");
//creamos un objeto inOrder, pasando los mocks que necesitan verificarse en orden
InOrder inOrder = inOrder(firstMock, secondMock);
Realizar verificaciones en orden son muy flexibles. no es necesario verificar todas las interacciones, si no slo aquellas que
necesitamos.
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
//verificacion ordinaria
verify(mockOne).add("one");
01.
02.
03.
04.
05.
06.
07.
08.
//usando mocks
mockedList.add("one");
mockedList.add("two");
verify(mockedList).add("one");
Ojo! : verifyNoMoreInteractions() debe ser llamada solo cuando necesario. Realizar llamadas a este mtodo asiduamente (sobre todo
en todas las pruebas) generar test muy poco mantenibles y ampliables. Es mejor usar never() para aquellos mtodos que no deban
ser interaccionados.
@Mock
Nos permite realizar mocks anotando el cdigo, y as el mismo queda ms claro y limpio.
view plain
01.
02.
03.
04.
05.
06.
07.
08.
09.
Importante! La siguiente llamada debe encontrarse en algun lugar de una clase base o del test runner:
view plain
01.
MockitoAnnotations.initMocks(testClass);
O se pueden usar como runners MockitoJUnitRunner, MockitoJUnit44Runner. (veremos en otro tutorial un ejemplo).
Conclusiones
Como hemos podido ver en este tutorial, el uso de mock objects nos facilita mucho crear test unitarios que no dependen de las capas
inferiores, y por tanto prueben las clases de cierta capamucho ms exhaustivamente, permitiendo la detecci&aoacute;n de errores y
asegurndonos el buen funcionamiento durante el futuro.
Algunos, tras ver los snippets de cdigo anteriores pensaran... y para qu me sirve mockito?, por qu 'perder' el tiempo usando
mock objects cuando puedo realizar las pruebas apoyandome en otras clases que ya han sido probadas, y funcionan bien?. Es un
error. Lo primero, NUNCA se pierde tiempo en generar test ni en usar mock objects, puesto que ese cdigo nos automatizar las
tareas de pruebas nos slo durante el desarrollo, si no tambien durante las fases de mantenimiento de la aplicacin; y pensar que el
cdigo que hoy no falla no puede fallar maana es err&aoacute;neo tambin.. y si el fallo esta en las clases en las que nos
apoyamos.. nuestros tests fallaran cuando nuestras clases (puede que) funcionen bien.
Ya vis que en Autentia nos gusta trabajar bien, y con las ltimas herramientas, que nos ahorren tiempo y esfuerzo, asi que no
dud&aeacute;is en contactar con nosotros para ms informacin.
j
k
l
m
n
Malo
j
k
l
m
n
Regular
j
k
l
m
n
Bueno
j
k
l
m
n
Muy bueno
j
k
l
m
n
Votar
Recuerda
Autentia te regala la mayora del conocimiento aqu compartido (Ver todos los
tutoriales). Somos expertos en: J2EE, Struts, JSF, C++, OOP, UML, UP, Patrones de
diseo ... y muchas otras cosas.
Servicio de notificaciones:
Aceptar
Tutoriales recomendados
Nombre
Resumen
Fecha
2007-08-09
5459
JUnit 4. Pruebas de
Software Java
2006-06-02
12438
2004-06-30
9518
2008-02-17
2008
2007-08-02
8676
2006-11-13
6691
2006-11-17
4243
Pruebas de Rendimiento y
Funcionales Web
35578
2007-02-08
4274
6933
Nota:
Los tutoriales mostrados en este Web tienen como objetivo la difusin del conocimiento. Los contenidos y comentarios de los
tutoriales son responsabilidad de sus respectivos autores. En algn caso se puede hacer referencia a marcas o nombres cuya
propiedad y derechos es de sus respectivos dueos. Si algn afectado desea que incorporemos alguna resea especfica, no tiene
ms que solicitarlo. Si alguien encuentra algn problema con la informacin publicada en este Web, rogamos que informe al
administrador [email protected] para su resolucin.