EasyMock: Mocks… eh… fácil.
El TDD es muy lindo hasta que nos toca hacer un test unitario a un componente que tiene muchas dependencias, que en estos tiempos de arquitecturas multitier suelen ser la mayoria.
Estas dependencias suelen remplazarse por objetos que simulan ser los reales compartiendo la misma interfaz. Claro que es solo una fachada, su implementación dista mucho de ser la real, pero nos proporcionan un comportamiento determinista y controlado contra el que probar nuestros componentes. EasyMocks es un framework que permite crear estos objetos de forma muy sencilla indicando cual es la interfaz que deben cumplir y cual es el comportamiento que esperamos.
Creando el Mock
Lo primero que necesitamos es decirle al framework cual va a ser la interfaz que queremos implementar en nuestro “mock”. Supongamos que necesitamos testear una clase Cliente que necesita los favores de una clase que implemente Servicio. Lo que vamos a hacer es un “mock” que simule ser una implementacion real de Servicio pero solo la vamos a usar para llevar a cabo el test.
El metodo estatico createMock de la clase EasyMock toma una Interface como parametro (tambien puede ser una clase) y nos devuelve un objeto que la implementa.
Servicio servicioMock = EasyMock.createMock(Servicio.class)
Its Alive!!
Genial, ¿Ya podemos pasarle la referencia servicioMock al Cliente y testear a gusto?… bueno… no tan easy.
A continuacion vamos a hacer que ese servicioMock implemente la operacion sumarDiez que, a partir de un parametro int numero devuelve ese numero incrementado en 10. No va a ser la implementacion real, solo a ’simular’ que esta haciendo algo realmente mediante el metodo EasyMock.expect.
EasyMock.expect(servicioMock.sumarDiez(5)).andReturn(15);
Acabamos de decirle a nuestro servicioMock que cuando alguien invoque al metodo sumarDiez con el numero 5 como parametro el debe devolver 15. No hay implementacion real, solo se pretende estar realizando la operacion. Ademas nuestro mock no sabe que hacer si alguien le pasa el numero 6 como parametro, y nos lo hara saber con una hermosa excepción.
Easymock.replay(servicioMock);
Esto pone al mock en ‘test mode’ indicando que ya podemos usarlo para nuestro test.
Still alive… and well?
Ahora sí podemos meter el servicioMock en nuestro test y admirar a EasyMock en toda su gloria
Ojo que lo que estamos testeando es el comportamiento de Cliente y no de Servicio! es decir que invocarAlMetodoSumarDiezDeServicio() este delegando correctamente e invocando a Servicio.
Cliente cliente = new Cliente(); cliente.setServicio(servicioMock); int esultado = cliente.invocarAlMetodoSumarDiezDeServicio(10); assertEquals(15,resultado);
Las posibilidades que tiene Easymock son ilimitadas y podemos simular comportamientos extremadamente complejos. Pueden encontrar mas informacion sobre todo el potencial de EasyMock en su página oficial.