Spring Web Flow - Come posso impostare unit test con valori già in conversationScope?
-
03-07-2019 - |
Domanda
Sto lavorando a un progetto utilizzando Spring Web Flow 2.0.
Sto provando a testare un'unità un flusso che inizia con uno stato decisionale. Lo stato decisionale controlla il valore di un oggetto che si trova su conversationScope
. Non riesco a capire come inserire un valore in conversationScope
per l'unità di test.
Ho provato:
getConversationScope().put("someName", value);
MockExternalContext context = new MockExternalContext();
startFlow(context);
Tuttavia, quando chiamo startFlow (contesto)
sembra che il valore sia cancellato.
Ho anche provato:
MockExternalContext context = new MockExternalContext();
setCurrentState("someDecisionState");
resumeFlow(context)
Ma il test fallisce con un errore che mi dice che non posso riprendere da uno stato di decisione, solo da uno stato di visualizzazione.
Qualcuno sa come posso inserire valori fittizi in conversationScope
in modo da poter testare questi casi?
Soluzione
Non è ovvio, ma ho pensato a questo:
public void testFoo() {
FlowExecution flowExecution = getFlowExecutionFactory().createFlowExecution(getFlowDefinition());
updateFlowExecution(flowExecution);
flowExecution.getConversationScope().put("fooBar", "goo");
flowExecution.start(null, new MockExternalContext());
assertCurrentStateEquals("fooView");
}
Ho dovuto scavare nel sottostante AbstractXmlFlowExecutionTests.startFlow ()
per vedere come stava istanziando il FlowExecution
e copiarlo e incollarlo nel test unitario.
Ecco il flusso web di test.
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
<action-state id="decideFoo">
<evaluate expression="conversationScope.fooBar" />
<transition on="goo" to="fooView" />
<transition on="gar" to="barView" />
</action-state>
<view-state id="fooView" />
<view-state id="barView" />
</flow>