Sustitución fácil de colaboradores con Mockito

Acabo de probar Mockito y creo que por fin he encontrado el framework de mocks que necesitaba. Crear “stubs” para sustituir a los colaboradores en las pruebas con EasyMock o jMock me resultaba muy laborioso, en cambio con Mockito es muy fácil.

El ejemplo:


@Test
public void testComprarUnProducto() {
TerminalPuntoDeVenta tpv = new TerminalPuntoDeVenta(100,logger);

CodigoProducto codigo = new CodigoProducto("FANTA 33CL","1234567890");
DispositivoEscaner mockEscaner = mock(DispositivoEscaner.class);
when(mockEscaner.scan()).thenReturn(codigo);
tpv.setEscaner(mockEscaner);

RepositorioProductos mockRepositorioProductos = mock(RepositorioProductos.class);
Producto producto = new Producto(codigo);
producto.setPrecio(10);
when(mockRepositorioProductos.buscarProducto(codigo)).thenReturn(producto);
tpv.setRepositorioProductos(mockRepositorioProductos);

tpv.setImpresora(mock(DispositivoTicket.class));

tpv.iniciarCompra();
tpv.scan();
tpv.finalizarCompra();
double resultado = tpv.cerrarCaja();
assertEquals(110,resultado,0);
}

Los métodos estáticos mock y when son la clave, especialmente when, porque en vez de liarnos a grabar expectations como con otros frameworks, con Mockito decimos cuando llamen al objeto sustituido a tal método y con tales parámetros, entonces devuelve tal resultado. Mucho más intuitivo.

Además, como estoy intentando “quitarme” de las pruebas que comprueban las colaboraciones, me viene genial; aunque si quisiera, no tengo más que hacer los verify que también haría con los otros.

Actualización:
He sacado un rato y he escrito el mismo ejemplo pero con EasyMock.


@Test
public void testComprarUnProductoConEasymock() {
TerminalPuntoDeVenta tpv = new TerminalPuntoDeVenta(100,logger);

CodigoProducto codigo = new CodigoProducto("FANTA 33CL","1234567890");
DispositivoEscaner mockEscaner = createMock(DispositivoEscaner.class);
mockEscaner.scan();
expectLastCall().andReturn(codigo);
tpv.setEscaner(mockEscaner);

RepositorioProductos mockRepositorioProductos = createMock(RepositorioProductos.class);
Producto producto = new Producto(codigo);
producto.setPrecio(10);
mockRepositorioProductos.buscarProducto(codigo);
expectLastCall().andReturn(producto);
tpv.setRepositorioProductos(mockRepositorioProductos);

DispositivoTicket mockImpresora = createNiceMock(DispositivoTicket.class);
tpv.setImpresora(mockImpresora);

replay(mockEscaner);
replay(mockImpresora);
replay(mockRepositorioProductos);

tpv.iniciarCompra();
tpv.scan();
tpv.finalizarCompra();
double resultado = tpv.cerrarCaja();
assertEquals(110,resultado,0);
}