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