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

それは明白ではないのですが、私はこの思い付いた:私はそれがFlowExecutionをインスタンス化された方法を確認するために、基礎となるAbstractXmlFlowExecutionTests.startFlow()を掘り下げると、ユニットテストにその一部をコピーして貼り付ける必要があった

public void testFoo() { 
    FlowExecution flowExecution = getFlowExecutionFactory().createFlowExecution(getFlowDefinition()); 
    updateFlowExecution(flowExecution); 
    flowExecution.getConversationScope().put("fooBar", "goo"); 
    flowExecution.start(null, new MockExternalContext());   
    assertCurrentStateEquals("fooView"); 
} 

テストウェブの流れです。

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

チャンスを得たときにニースが試してくれます。 –

+0

完璧に、ありがとう! startFlow(コンテキスト)を使用すると、あなたのflowExecutionに設定したものがすべてクリアされているように見えるので、キービットがflowExecution.start(null、context)を使用しているようです。 –

+0

喜んで助けてくれました。はい、startFlow(コンテキスト)メソッドは、バックグラウンドで新しいFlowExecutionを作成します。この例では、独自のFlowExecutionを使用することができます。ただし、手動で管理するコードを増やす必要はありません。 –

関連する問題