Установка messages.properties в модульном тесте Spring Webflow

Я использую Spring Web Flow 2.0.7 и только начал настраивать свои модульные тесты. У меня есть каталог потоков, содержащий файлы потока xml и файлы 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?

2 ответа

Я знаю, сколько лет этому вопросу, но, найдя решение, я решил опубликовать его для других:

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, преобразует все сообщения в сам код. Это не разрешит ваши сообщения правильно, но предотвратит сбой, который вы перечислили, и позволит пройти тесты.

Если есть лучший способ, мне действительно было бы интересно услышать об этом, поскольку это всего лишь обходной путь.

Я должен был создать 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));
}
Другие вопросы по тегам