Spring Web Flow – как настроить модульный тест со значениями, уже находящимися в разговоре?
-
03-07-2019 - |
Вопрос
Я работаю над проектом, используя Spring Web Flow 2.0.
Я пытаюсь выполнить модульное тестирование потока, который начинается с состояния решения.Состояние решения проверяет значение объекта, находящегося на conversationScope
.Я не могу понять, как вставить значение в conversationScope
для модульного теста.
Я пытался:
getConversationScope().put("someName", value);
MockExternalContext context = new MockExternalContext();
startFlow(context);
Однако кажется, что когда я звоню startFlow(context)
значение очищается.
Я также попробовал:
MockExternalContext context = new MockExternalContext();
setCurrentState("someDecisionState");
resumeFlow(context)
Но тест завершается неудачно с ошибкой, сообщающей мне, что я не могу возобновить работу из состояния решения, а только из состояния просмотра.
Кто-нибудь знает, как я могу вставить фиктивные значения в conversationScope
чтобы я мог проверить эти случаи?
Решение
Это не очевидно, но я придумал следующее:
public void testFoo() {
FlowExecution flowExecution = getFlowExecutionFactory().createFlowExecution(getFlowDefinition());
updateFlowExecution(flowExecution);
flowExecution.getConversationScope().put("fooBar", "goo");
flowExecution.start(null, new MockExternalContext());
assertCurrentStateEquals("fooView");
}
Мне пришлось копаться в основе AbstractXmlFlowExecutionTests.startFlow()
чтобы увидеть, как он создавал экземпляр FlowExecution
, а также скопируйте и вставьте часть этого в модульный тест.
Вот тестовый веб-поток.
<?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>