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);
}