12 DecSustitució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); }