5

我正在使用 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以便我可以测试这些案例?

4

1 回答 1

6

这并不明显,但我想出了这个:

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>
于 2009-08-24T22:56:15.900 回答