Spring Web Flow — как настроить модульный тест со значениями, которые уже находятся в разговоре?

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


person TM.    schedule 29.04.2009    source источник


Ответы (1)


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

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>
person Scott Bale    schedule 24.08.2009
comment
Красиво, попробую при случае - person TM.; 25.08.2009
comment
Работает отлично, спасибо! Похоже, что ключевым битом является использование flowExecution.start(null, context), поскольку использование startFlow(context), кажется, очищает все, что вы настроили в своем flowExecution. - person TM.; 28.08.2009
comment
Рад, что помог. Да, метод startFlow(context) создает новый FlowExecution за кулисами. В этом примере вы можете использовать свой собственный FlowExecution за счет написания дополнительного кода для управления им вручную. - person Scott Bale; 29.08.2009