【发布时间】: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 个要求:
-
使用“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(); -
生成“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