Установка messages.properties в модульном тесте Spring Webflow - PullRequest
2 голосов
/ 10 июня 2009

Я использую 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 ]

0 голосов
/ 12 мая 2015

Мне пришлось создать 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));
}
0 голосов
/ 21 ноября 2011

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

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

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

...