2009-06-09 25 views
2

私はSpring Web Flow 2.0.7を使用しており、単体テストの設定を開始しました。フローXMLファイルとクラスパス上のmessages.propertiesファイルを含むフローディレクトリがあります。Spring Webflowユニットテストでのmessages.propertiesの設定

これはうまくロードされますが、フローのmessages.propertiesファイルが自動的に選択されていないようで、指定されたコードのメッセージを解決できないため、検証ユニットのテストに失敗します。ここで

は、例外の関連部分です:

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

これは、エラーメッセージを生成するmessages.propertiesで解決コードを使用するには、かなり一般的なシナリオのように思えます。ですから、messages.propertiesファイルをロードするにはどうすればよいでしょうか?

+0

ユニットテストやWebフロー自体では解決できないと言っていますか? –

+0

ユニットテストの場合。 – InverseFalcon

答えて

0

私はこの質問は何歳知っているが、私は他人のためにそれを投稿しようと思いました解決策を見つけた:

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); 
     } 

あなたconfigureFlowBuilderContext方法に置か上記のコードは、全てのメッセージを解決しますコード自体。これはあなたのメッセージを正しく解決しませんが、あなたが列挙した失敗を防ぎ、あなたのテストが合格するようにします。

もっと良い方法があれば、本当に唯一の回避策であるので、私は本当にそれについて聞いてみたいと思います。

0

カスタムWebフローバリデーターを使用するには、ValidationContextを作成しなければなりませんでした。私は反射を使って解決しました

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)); 
} 
関連する問題