2009-06-09 10 views
2

Ich verwende Spring Web Flow 2.0.7 und habe gerade damit begonnen, meine Komponententests einzurichten. Ich habe mein Flow-Verzeichnis, das die XML-Flow-Dateien und meine messages.properties-Dateien in meinem Klassenpfad enthält.Einstellen von messages.properties in einem Spring Webflow-Komponententest

Es wird geladen, aber es scheint nicht automatisch die messages.properties-Datei für den Fluss abzurufen, und daher sind meine Validierungseinheit Tests fehlgeschlagen, da es eine Nachricht für den angegebenen Code nicht auflösen kann.

Hier ist der relevante Teil der Ausnahme:

org.springframework.context.NoSuchMessageException: No message found under code 'error_alnum_char_count_not_atleast' for locale 'en_US'. 

Dies wie ein recht häufiges Szenario scheint, die Codes in messages.properties aufgelöst zu verwenden, um Fehlermeldungen zu erzeugen. Also ... Wie wird empfohlen, die Datei messages.properties zu laden?

+0

Sie sagen, die Nachrichten können nicht in Ihren Komponententests oder im Web-Flow selbst gelöst werden? –

+0

In den Unit-Tests. – InverseFalcon

Antwort

0

Ich weiß, wie alt diese Frage, aber eine Lösung gefunden zu haben, ich dachte, dass ich es für andere schreiben würde:

Object obj = builderContext.getApplicationContext() 
       .getBean(AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME); 
     obj = builderContext.getApplicationContext().getBean(AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME); 
     if (obj != null && obj instanceof StaticMessageSource) { 
      StaticMessageSource messageSource = (StaticMessageSource) obj; 
      messageSource.setUseCodeAsDefaultMessage(true); 
     } 

Der obige Code in Ihre configureFlowBuilderContext Methode gesetzt, werden alle Meldungen an die lösen Code selbst. Dadurch werden Ihre Nachrichten nicht korrekt aufgelöst, jedoch wird der Fehler, den Sie aufgelistet haben, verhindert und Ihre Tests können bestanden werden.

Wenn es einen besseren Weg gibt, würde ich wirklich daran interessiert sein, davon zu hören, da dies wirklich nur ein Workaround ist.

0

Ich musste ein ValidationContext erstellen, um in benutzerdefinierten Web-Flow-Validatoren zu verwenden. Ich löste mit Reflexion

protected MessageSource validationMessages; 

/** 
* Creates a validationContext 
* We have to use reflection because there's no way to set 
    the messageSource inside {@link MockRequestContext} otherwise 
* 
* @return {@link ValidationContext} 
* @throws IllegalAccessException 
* @throws NoSuchFieldException 
*/ 
protected ValidationContext getValidationContext() throws IllegalAccessException, NoSuchFieldException { 
    final MockRequestContext requestContext = new MockRequestContext(); 
    requestContext.setExternalContext(context); 
    final DefaultMessageContext defaultMessageContext = new DefaultMessageContext(validationMessages); 
    final Field messageContextField = MockRequestContext.class.getDeclaredField("messageContext"); 
    final boolean accessible = messageContextField.isAccessible(); 
    messageContextField.setAccessible(true); 
    messageContextField.set(requestContext, defaultMessageContext); 
    messageContextField.setAccessible(accessible); 
    return new DefaultValidationContext(requestContext, "validateInfo", mock(MappingResults.class)); 
}