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); } }
Publicar un comentario