2009-06-09 5 views
2

스프링 웹 플로우 2.0.7을 사용하고 있으며, 단위 테스트를 설정하기 시작했습니다. flow xml 파일과 내 messages.properties 파일을 클래스 디렉토리에 포함하고 있습니다.스프링 웹 플로우 유닛 테스트에서 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

유닛 테스트 또는 웹 플로우 자체에서 메시지를 확인할 수 없다는 말입니까? –

+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

내부 웹 흐름 검사기를 사용하려면 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)); 
} 
관련 문제