2009-04-29 7 views
4

Je travaille sur un projet utilisant Spring Web Flow 2.0. J'essaie de tester un flux qui commence par un état de décision. L'état de décision vérifie la valeur d'un objet sur le conversationScope. Je ne peux pas comprendre comment insérer une valeur dans le conversationScope pour le test unitaire.Spring Web Flow - Comment puis-je configurer un test unitaire avec des valeurs déjà présentes dans conversationScope?

J'ai essayé:

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

Cependant, il semble que quand je l'appelle startFlow(context) la valeur est effacée.

J'ai essayé aussi:

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

Mais le test échoue avec une erreur me disant que je ne peux pas reprendre d'un état de décision, que d'un état d'affichage.

Est-ce que quelqu'un sait comment je peux insérer des valeurs fictives sur le conversationScope afin que je puisse tester ces cas?

Répondre

5

Il est pas évident, mais je suis venu avec ceci:

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

je devais creuser dans le AbstractXmlFlowExecutionTests.startFlow() sous-jacente pour voir comment il a été instancié avec la FlowExecution, et copier et coller une partie de ce dans le test unitaire .

Voici le flux Web de test.

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

Nice, j'essaierai quand j'aurai une chance –

+0

Fonctionne parfaitement, merci! On dirait que le bit clé utilise flowExecution.start (null, context), car l'utilisation de startFlow (context) semble effacer tout ce que vous avez configuré sur votre flowExecution. –

+0

Heureux d'avoir aidé. Oui, la méthode startFlow (contexte) crée une nouvelle FlowExecution dans les coulisses. Avec cet exemple, vous pouvez utiliser votre propre FlowExecution, au prix d'écrire plus de code pour le gérer manuellement. –

Questions connexes