Editor para Concordion

Papá Noel me ha traído esta Nochebuena un plugin Eclipse para facilitar el trabajo con Concordion. Si abro una especificación (un fichero html) con el editor Concordion, se abre una ventana de edición con dos pestañas: una con la especificación y otra con la fixture (el fichero java asociado). De la misma manera, si abro la fixture (un fichero java) con este editor, se abre una ventana de edición con las mismas dos pestañas y los mismos contenidos. Las fixtures se editan con el editor Java estándar y las especificaciones html con el editor web, que a su vez tiene dos pestañas: una con la vista de diseño y otra con la de previsualización. Además, la vista de diseño web está dividida y muestra arriba la página web para editar en formato WYSIWYG y abajo en puro HTML.

He basado el desarrollo en el ejemplo de editor multipágina que viene con Eclipse y en el WicketBench, un editor para Wicket que hace muchas más cosas y del que he tomado prestadas algunas ideas también para el futuro. Sin embargo, aún tengo que trabajar mucho este plugin porque es la primera vez que hago algo útil con Eclipse RCP y tengo mucho que aprender. De momento, los siguientes pasos serán:

  1. hacer pruebas unitarias (para poder refactorizar)
  2. refactorizar (es mejor no mirar al código ahora mismo)
  3. crear automáticamente el desplegable en forma de site (ahora es un jar que construyo manualmente)

Podéis descargar el jar y simplemente dejarlo en la carpeta “plugins” de vuestra instalación de Eclipse.

Felices Fiestas a todos, por cierto.

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:

  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.

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