2009-04-29 8 views
4

Ich arbeite an einem Projekt mit Spring Web Flow 2.0.Spring Web Flow - Wie kann ich Komponententests mit Werten einrichten, die bereits in conversationScope enthalten sind?

Ich versuche Unit-Test einen Fluss, der mit einem Entscheidungszustand beginnt. Der Entscheidungsstatus überprüft den Wert eines Objekts, das sich auf der conversationScope befindet. Ich kann nicht herausfinden, wie man einen Wert in den conversationScope für den Komponententest einfügt.

Ich habe versucht:

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

Es scheint jedoch, dass, wenn ich startFlow(context) rufen Sie den Wert gelöscht wird.

ich auch versucht:

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

Aber der Test nicht mit einem Fehler mir zu sagen, dass ich nicht von einem Entscheidungszustand wieder aufgenommen werden kann, nur aus einer Sicht Zustand.

Weiß jemand wie ich Mock-Werte auf die conversationScope einfügen kann, damit ich diese Fälle testen kann?

Antwort

5

Es ist nicht offensichtlich, aber ich kam mit dieser:

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

ich in die darunter liegende AbstractXmlFlowExecutionTests.startFlow() graben mussten, um zu sehen, wie sie die FlowExecution wurde instanziiert wird, und kopieren und einige, dass in das Gerät Prüfpaste .

Hier ist der Test Web-Flow.

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

Schön, werde versuchen, wenn ich eine Chance bekomme –

+0

Funktioniert perfekt, danke! Sieht so aus, als ob das Schlüsselbit flowExecution.start (null, context) verwendet, da die Verwendung von startFlow (context) scheinbar alles löscht, was Sie in Ihrer flowExecution eingerichtet haben. –

+0

Ich bin froh, dass ich geholfen habe. Ja, die Methode startFlow (context) erstellt hinter den Kulissen eine neue FlowExecution. In diesem Beispiel können Sie Ihre eigene FlowExecution verwenden, auf Kosten von mehr Code, um es manuell zu verwalten. –

Verwandte Themen