我可以配置MockMvcBuilders.standaloneSetup()以使用我的消息转换器XML配置吗?

时间:2013-08-15 14:18:35

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

我正在开发一个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 时,是否包含一些隐藏或默认的消息转换器但是当我调用上面的代码时,我会以某种方式覆盖这些转换器?我怎么能包括它们?

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

1 个答案:

答案 0 :(得分:0)

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

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

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