使用 MockMvc 获取 httpServletRequest 属性

2022-09-03 05:56:44

我有一个非常简单的控制器,以这种方式定义:

@RequestMapping(value = "/api/test", method = RequestMethod.GET, produces = "application/json")
public @ResponseBody Object getObject(HttpServletRequest req, HttpServletResponse res) {
    Object userId = req.getAttribute("userId");
    if (userId == null){
        res.setStatus(HttpStatus.BAD_REQUEST.value());
    }
    [....]
}

我试图以许多不同的方式使用MockMvc进行调用,但是,我无法提供属性“userId”。

例如,有了这个,它就不起作用:

MockHttpSession mockHttpSession = new MockHttpSession(); 
mockHttpSession.setAttribute("userId", "TESTUSER");             
mockMvc.perform(get("/api/test").session(mockHttpSession)).andExpect(status().is(200)).andReturn(); 

我也试过这个,但没有成功:

MvcResult result = mockMvc.perform(get("/api/test").with(new RequestPostProcessor() {
     public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) {
           request.setParameter("userId", "testUserId");
           request.setRemoteUser("TESTUSER");
           return request;
     }
})).andExpect(status().is(200)).andReturn(); 

在这种情况下,我可以在HttpServletRequest上设置RemoteUser,但不能设置属性映射。

有什么线索吗?


答案 1

您可以通过调用来添加请求属性requestAttr ^^

mockMvc.perform(get("/api/test").requestAttr("userId", "testUserId")...

答案 2

您可以使用

mvc.perform(post("/api/v1/...")
    .with(request -> {
      request.addHeader(HEADER_USERNAME_KEY, approver);
      request.setAttribute("attrName", "attrValue");
      return request;
    })
    .contentType(MediaType.APPLICATION_JSON)...

推荐