2009-04-29 48 views
4

我正在使用Spring Web Flow 2.0进行项目工作。Spring Web Flow - 如何使用conversationScope中的值设置单元测试?

我想单元测试一个以决策状态开始的流程。决策状态检查conversationScope上的对象的值。我无法弄清楚如何在单元测试中为conversationScope插入一个值。

我曾尝试:

getConversationScope().put("someName", value); 
MockExternalContext context = new MockExternalContext(); 
startFlow(context); 

然而,似乎当我打电话startFlow(context)值被清零。

我也试过:

MockExternalContext context = new MockExternalContext(); 
setCurrentState("someDecisionState"); 
resumeFlow(context) 

但测试失败,错误告诉我,我不能决定状态恢复,只能从视图状态。

有谁知道我可以在conversationScope上插入模拟值,以便测试这些情况吗?

回答

5

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

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,复制和一些是粘贴到单元测试。

这里是测试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> 
+0

不错,请尝试当我有机会 – 2009-08-24 23:15:56