【问题标题】:Setting messages.properties in a Spring Webflow unit test在 Spring Webflow 单元测试中设置 messages.properties
【发布时间】:2015-05-13 00:25:52
【问题描述】:

我正在使用 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 文件的推荐方法是什么?

【问题讨论】:

  • 您是说无法在单元测试中或在 Web Flow 本身中解析消息?

标签: java unit-testing resources messages spring-webflow-2


【解决方案1】:

我知道这个问题有多老了,但是找到了一个解决方案,我想我会把它发布给其他人:

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 方法中,会将所有消息解析为代码本身。这不会正确解决您的消息,但会防止您列出的失败并允许您的测试通过。

如果有更好的方法,我真的很想知道它,因为这实际上只是一种解决方法。

【讨论】:

    【解决方案2】:

    我必须创建一个ValidationContext 才能在自定义 Web 流验证器中使用。我用反射解决了

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-14
      • 2012-03-26
      • 2016-11-03
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 2019-04-10
      • 2011-10-01
      相关资源
      最近更新 更多