Получение атрибута httpServletRequest с помощью MockMvc

У меня есть очень простой контроллер, определенный таким образом:

@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(); 

В этом случае я могу установить RemoteUser, но никогда не карту Attributes в HttpServletRequest.

Любая подсказка?


person Andrea Girardi    schedule 05.02.2016    source источник
comment
параметр != атрибут.   -  person M. Deinum    schedule 05.02.2016


Ответы (3)


Вы добавляете атрибут запроса, вызывая requestAttr ^^

mockMvc.perform(get("/api/test").requestAttr("userId", "testUserId")...
person a better oliver    schedule 05.02.2016
comment
это спасло мой день. Я тратил время с утра. Спасибо - person Arvind Kumar; 19.06.2020

Вы могли бы использовать

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

@ResponseStatus(HttpStatus.OK)
@GetMapping(Routes.VALIDATE_EMAIL_TOKEN + "/validate")
public String validateEmailToken(@RequestParam(value = "token") String token,
                                 HttpServletRequest httpServletRequest) throws RestServiceException {
    return credentionChangeService.getUserByToken(token, httpServletRequest);
}

//Метод испытания

@Mock
private HttpServletRequest httpServletRequest
@Mock
private MerchantCredentialsChangeService mockCredentionChangeService;

@Test
public void testValidateEmailToken() throws Exception {
    final String token = "akfkldakkadjfiafkakflkd";
    final String expectedUsername = "9841414141";

    Mockito.when(mockCredentionChangeService.getUserByToken(Matchers.eq(token), Matchers.any(HttpServletRequest.class)))
            .thenReturn(expectedUsername);

    mockMvc.perform(get(Routes.VALIDATE_EMAIL_TOKEN + "/validate")
            .param("token", token))
            .andExpect(status().isOk())
            .andExpect(MockMvcResultMatchers.content().string(expectedUsername));
}
person Milan Paudyal    schedule 20.05.2019