2009-04-29 5 views
4

Я работаю над проектом, используя Spring Web Flow 2.0.Spring Web Flow - как я могу настроить модульный тест со значениями уже в режиме разговора?

Я пытаюсь выполнить модульный тест потока, который начинается с состояния принятия решения. Состояние решения проверяет значение объекта, который находится на 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, а затем скопировать и вставить часть этого в тест на единицу ,

Вот тестовый веб-поток.

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

Работает отлично, спасибо! Кажется, что ключевой бит использует flowExecution.start (нуль, контекст), поскольку использование startFlow (контекст), кажется, очищает все, что вы настроили при выполнении flowExecution. –

+0

Рад помочь. Да, метод startFlow (context) создает новое поточное выполнение за кулисами. В этом примере вы можете использовать свой собственный FlowExecution, за счет написания большего количества кода, чтобы управлять им несколько вручную. –