5

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

4

1 回答 1

0

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

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

你可以在这里找到一个例子(这是一个为大学编写的教学项目)。

于 2015-06-23T14:05:25.780 回答