如何用MockMvc验证响应Location头中的重定向URL参数
问题:验证MockMvc重定向Location头中的所有URL参数
我正在使用MockMvc测试一个端点,该端点会执行重定向操作,因此响应头的Location字段中会包含一个带多个参数的URL,示例如下:
https://platform:8080/auth?scope=openid&response_type=id_token&response_mode=form_post&prompt=none&client_id=toolid&redirect_uri=https://localhost:8080/tool/token/receiver&login_hint=loginHint&state=1d73c90f-fe03-47dc-9e28-ed416fad7773&nonce=7b5e7240-161e-4d78-8e32-54923c9ce04a
我需要验证这个URL里的9个参数全部存在。我最初尝试的代码如下:
mockMvc.perform(get(OIDC_INIT_FLOW_ENDPOINT) .contentType(MediaType.APPLICATION_FORM_URLENCODED) .params(initFlowRequestParams)) .andExpect(status().isFound()) .andExpect(header().exists(LOCATION)) .andExpect(header().string(LOCATION, contains("openId")));
这段代码的最后一个andExpect断言无法正常工作,但能体现我的需求,请问该如何实现目标?
解决方案
在Chris的帮助下,我找到了可行的实现方案:
mockMvc.perform(get(OIDC_INIT_FLOW_ENDPOINT).contentType(MediaType.APPLICATION_FORM_URLENCODED).params(initFlowRequestParams)) .andExpect(status().isFound()) .andExpect(header().exists(LOCATION)) .andExpect(header().string(LOCATION, Matchers.allOf(containsString("scope"), containsString("response_type"), containsString("response_mode"), containsString("prompt"), containsString("client_id"), containsString("redirect_uri"), containsString("login_hint"), containsString("state"), containsString("nonce"))));
注:原解决方案代码中重复写了一次
containsString("response_type"),已修正为response_mode,确保覆盖全部9个参数
内容的提问来源于stack exchange,提问作者Edgar Hernandez
相关产品推荐
相关产品推荐

