Spring Web Flow - Как я могу настроить модульный тест со значениями, уже находящимися в разговорном поле? - PullRequest
4 голосов
/ 30 апреля 2009

Я работаю над проектом, использующим 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, чтобы я мог проверить эти случаи?

1 Ответ

5 голосов
/ 25 августа 2009

Это не очевидно, но я придумал это:

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>
...