使用MvcMock将HttpServletRequest设置为测试方法参数

时间:2015-11-17 22:22:02

标签: spring-mvc junit4 mockmvc

我正在使用方法签名为其中一个控制器方法编写junit,如下所示:

@RequestMapping(value="/getTokenizedURL.json",method=RequestMethod.POST)
@ResponseBody
public ResponseData getTokenizedURL(@RequestBody final RequestData requestData, final HttpServletRequest request) throws CustomException

我需要使用MockMvc调用此方法,我可以使用以下方法调用:

mockMvc.perform(post("/user/getTokenizedURL.json")
    .contentType(MediaType.APPLICATION_JSON)
    .content(json))
    .andDo(print())
    .andExpect(status().isOk());

但问题是我在使用mock mvc调用原始方法时无法设置HttpServletRequest参数。如果没有设置HttpServletRequest参数,我的测试会给出问题,因为它是必需的并且在原始方法中使用。

请告诉我如何设置相同的内容。谢谢!

1 个答案:

答案 0 :(得分:4)

我们的想法是你不应该这样做。

MockMvcRequestBuilders#post(..)返回MockHttpServletRequestBuilder,可让您使用所需的任何值构建请求。这些将在HttpServletRequest中镜像,并传递给您的处理程序方法。

例如,您使用了

.contentType(MediaType.APPLICATION_JSON)

这将设置请求的content-type标头。在你的处理程序方法中,如果你做了

request.getHeader("content-type");

您为String取回了相应的MediaType.APPLICATION_JSON

MockHttpServletRequestBuilder有" setter"对于请求的每个部分。