【问题标题】:Can I configure MockMvcBuilders.standaloneSetup() to use my message converter XML configuration?我可以配置 MockMvcBuilders.standaloneSetup() 以使用我的消息转换器 XML 配置吗?
【发布时间】:2013-08-17 18:13:40
【问题描述】:

我正在开发一个 Spring MVC 3.2 Web 应用程序,并尝试在我的单元测试中使用新的 MockMvc 测试实用程序。我想测试两个单独的控制器以及整个 Web 应用程序加载我的 Spring 配置 XML 文件。从 Javadoc 看来,我想对前者使用 standaloneSetup,对后者使用 webAppContextSetup

但是,当我的控制器寻找消息转换器来转换输出时,我遇到了问题。我对 standaloneSetup 方法的 Javadoc 的解释似乎不正确。这是此方法的 Javadoc:

通过注册一个或多个@Controller 的实例并以编程方式配置 Spring MVC 基础架构来构建 MockMvc。这允许对控制器的实例化和初始化及其依赖项进行完全控制,类似于普通的单元测试,同时还可以一次测试一个控制器。

使用此选项时,DispatcherServlet 使用带注释的控制器为请求提供服务所需的最小基础架构会自动创建,并且可以自定义,从而产生与 MVC Java 配置提供的配置相同的配置,但使用构建器样式方法除外。

如果应用程序的 Spring MVC 配置相对简单,例如在使用 MVC 命名空间或 MVC Java 配置时,那么使用此构建器可能是测试大多数控制器的好选择。可以使用更少的测试来专注于测试和验证实际的 Spring MVC 配置。

我将“最小基础架构”和“及其依赖项”解释为意味着除了它们的所有依赖项之外,我指定的控制器将被加载,尽管我包括消息转换器。然而,情况似乎并非如此。我需要一个自定义配置来满足 2 个要求:

  1. 使用“application/json”的 PUT 操作被转换为带有 Joda DateTime 字段的 POJO。因此,我在 Spring 配置中包含以下内容:

    <mvc:annotation-driven>
      <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
           <property name="objectMapper" ref="myObjectMapper" />
        </bean>
      </mvc:message-converters>
    </mvc:annotation-driven>
    

    这适用于 webAppContextSetup 但如果我想使用 standaloneSetup 看起来我需要手动创建和配置一个 MappingJackson2HttpMessageConverter 配置我的自定义 ObjectMapper 注册了 JodaModule

    standaloneSetup(myController).setMessageConverters(myJsonConverter).build();
    
  2. 生成“application/custom+xml”的 GET 操作。当我加载 webAppContextSetup 时,无需额外配置即可使用。但是,当我加载 standaloneSetup 时,之前发生的任何 Spring 配置都不会发生,并且我看到以下错误消息:

    org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
    

    有人能描述一下这里发生了什么吗?当我调用 webAppContextSetup 时是否包含一些隐藏或默认的消息转换器,但是当我调用上面的代码时,我是否以某种方式覆盖了这些转换器?我怎样才能包括它们?

有没有更简单的方法使用 MockMvc 来设置单个控制器以及 mvc:annotation-driven 中的所有配置?我可以将 MockMvcBuilders.standaloneSetup() 配置为使用我的消息转换器 XML 配置,而不是手动配置每个配置吗?

【问题讨论】:

  • 您是否尝试过通过 StandaloneMockMvcBuilder#setMessageConverters 设置消息转换器?根据 JavaDoc,您可以使用此方法设置消息转换器以在参数解析器和返回值处理程序中使用

标签: java spring spring-mvc spring-test spring-test-mvc


【解决方案1】:

我认为没有更简单的方法。您必须通过StandaloneMockMvcBuilder#setMessageConverters 手动注册每个转换器。这是有道理的,因为您在 XML 配置中做同样的事情。请注意,如果使用 Java @Configuration 类,则相同。

独立设置旨在加载尽可能少的组件。这是最接近弹簧测试术语的单元测试。如果它是您想要的单元测试,您应该使用像 Mockito 这样的模拟框架来模拟您要测试的控制器的每个依赖项(包括转换器)。

您可以找到一个示例 here(这是一个为大学编写的教学项目)。

【讨论】:

    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多