我正在开发一个 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 ,该 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 配置,而不是手动配置每一个吗?