Spring Web Flow - Como posso configurar teste de unidade com os valores já conversationScope?
-
03-07-2019 - |
Pergunta
Eu estou trabalhando em um projeto usando Spring Web Flow 2.0.
Eu estou tentando unidade testar um fluxo que começa com um estado de decisão. O estado decisão verifica o valor de um objeto que está no conversationScope
. Eu não consigo descobrir como inserir um valor para o conversationScope
para o teste de unidade.
Eu tentei:
getConversationScope().put("someName", value);
MockExternalContext context = new MockExternalContext();
startFlow(context);
No entanto, parece que quando eu chamo startFlow(context)
o valor está desmarcada.
Eu também tentei:
MockExternalContext context = new MockExternalContext();
setCurrentState("someDecisionState");
resumeFlow(context)
Mas o teste falhar com um erro dizendo que eu não posso retomar de um estado de decisão, apenas a partir de um estado de exibição.
Alguém sabe como posso inserir valores simulados na conversationScope
para que eu possa testar estes casos?
Solução
Não é óbvio, mas eu vim com essa:
public void testFoo() {
FlowExecution flowExecution = getFlowExecutionFactory().createFlowExecution(getFlowDefinition());
updateFlowExecution(flowExecution);
flowExecution.getConversationScope().put("fooBar", "goo");
flowExecution.start(null, new MockExternalContext());
assertCurrentStateEquals("fooView");
}
Eu tive que escavar o AbstractXmlFlowExecutionTests.startFlow()
subjacente para ver como ele foi instanciar o FlowExecution
, e copiar e colar alguns dos que para o teste de unidade.
Aqui está um fluxo de ensaio web.
<?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>