2009-04-29 104 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