Probar WebFlow con Mockito


Aquí un ejemplo para probar el flow (Spring Web Flow) utilizando algunas cosas de Mockito también les dejo el link de la documentación: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch14s02.html

Espero les sirva especialmente la parte de probar action-state ya que no hay muchos ejemplo. (La explicación esta en el código)

package com.bancomer.seguros.front.salud.contrataciones.smb.views;

import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.stub;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.springframework.webflow.action.EventFactorySupport;
import org.springframework.webflow.config.FlowDefinitionResource;
import org.springframework.webflow.config.FlowDefinitionResourceFactory;
import org.springframework.webflow.test.MockExternalContext;
import org.springframework.webflow.test.MockFlowBuilderContext;
import org.springframework.webflow.test.execution.AbstractXmlFlowExecutionTests;

import com.prueba.AbstractSegurosXmlFlowExecutionTests;
import com.bancomer.seguros.front.webcore.actions.FlowExceptionAction;

@RunWith(JUnit4.class)
// Todas las clases de test para el flow deben extender de
// AbstractSegurosXmlFlowExecutionTests
public class TestFlow extends AbstractXmlFlowExecutionTests {

 private static final String PATH_WEB_FLOW = "url/donde/esta/nuestro/xml/con/el/flow";
 private static final String WEBFLOW_CLASS_ACTION = "nuestroAction";
 private static final String WEBFLOW_PARENTFLOW_CLASS_ACTION = "nuestraExceptionAction";
 private ContratacionAction action;

 // creamos nuestro contexto mockeado
 private final MockExternalContext context = new MockExternalContext();
 // creamos el soporte de eventos
 private final EventFactorySupport eventFactory = new EventFactorySupport();

 // Debemos sobreescribir el metodo para recuperar el xml donde tenemos
 // nuestro flow.xml
 @Override
 protected FlowDefinitionResource getResource(final FlowDefinitionResourceFactory resourceFactory) {

  final FlowDefinitionResource resource = resourceFactory.createResource(PATH_WEB_FLOW);
  // Verificamos que no sea nulo
  assertNotNull(resource);

  return resource;

 }

 // Sobreescribimos la configuracion de nuestro builder
 @Override
 protected void configureFlowBuilderContext(final MockFlowBuilderContext builderContext) {
  // nuestra action que ejecuta las acciones dentro de las transiciones
  builderContext.registerBean(WEBFLOW_CLASS_ACTION, action);
  builderContext.registerBean(WEBFLOW_PARENTFLOW_CLASS_ACTION, new FlowExceptionAction());
  // FlowExceptionAction es nuestra propia clase de excepciones
 }

 // Inicializamos el action
 @Before
 public void setUpActionMock() {
  action = mock(ContratacionAction.class);
 }

 @Test
 public void transitionPaso1ToSiguiente() {
  // Asi seteamos en que estado del flow queremos que inicie
  setCurrentState("id del view state");
  // Si se necesita hacer alguna validacion donde se requiera un form para
  // ejecutarse agregamos esta linea si solo (que ciontenga un
  // evalue-expresion) donde form es el modelo
  getFlowScope().put("form", new ContratacionForm());

  context.setEventId("id de la propiedad ON de la transicion");

  resumeFlow(context);
  // verificamos que el flow esta activo
  assertFlowExecutionActive();
  // verificamos que realmente nos cambio de estado
  assertCurrentStateEquals("id del nuevo view state");
  // verificacamos que esta dentro de la vista que queremos
  assertResponseWrittenEquals("el nomnre del view en el que debe estar", context);
 }

 // Probando que hemos terminado un ciclo
 @Test
 public void transitionToSiguiente() {

  setCurrentState("id del view state");
  context.setEventId("id de la propiedad On de la transicion");

  resumeFlow(context);
  // Asi verificamos que realmente se a termiando el flujo
  assertFlowExecutionEnded();
  // Verificamos que se quedo en el estatus de cerrar (o el nombre que
  // hallamos definido dentro del web flow xml)
  assertFlowExecutionOutcomeEquals("cerrarFlujo");
 }

 // Proibando cuando un action nos regresa un error
 @Test
 public void transitionPaso2ToSiguiente() {
  // simulamos el retorno de la accion (como si fuera un mock) diciendo
  // que nos regrese un error
  stub(action.calcularCotizacion(isA(ContratacionForm.class))).toReturn(eventFactory.error(action));
  setCurrentState("id del view state");
  getFlowScope().put("form", new ContratacionForm());
  context.setEventId("id de la propiedad On de la transicion");
  resumeFlow(context);

  assertFlowExecutionActive();
  assertCurrentStateEquals("id del nuevo view state");
  assertResponseWrittenEquals("el nomnre del view en el que debe estar", context);
 }

 // Suponiendo que tenemos un action state al que debemos entrar pero nuestro
 // action en vez de un succes nos regresa un evento lo probariamos asi:
 @Test
 public void transitionTarificadorPaso2ToSiguiente() {
  // Simulamos el regreso de la validacion que definira a donde nos
  // reenderizara el action estate en este caso a siguiente
  stub(action.aceptarCotizacion(isA(ContratacionForm.class))).toReturn(eventFactory.event(action, "siguiente"));
  setCurrentState("id del view state");

  getFlowScope().put("form", new ContratacionForm());

  context.setEventId("id de la propiedad On de la transicion");
  resumeFlow(context);

  assertFlowExecutionActive();
  assertCurrentStateEquals("id del nuevo view state");
  assertResponseWrittenEquals("el nomnre del view en el que debe estar", context);
 }

}

Post a Comment

Artículo Anterior Artículo Siguiente