MockMVC 在带有 post 请求的请求参数中添加带有字符串的附加引号

MockMVC adds additional quotes with string in request param with post request

MockMvc 在请求生成器 param() 中传入时在字符串末尾添加引号,如下所示

// initialization of mockMvc
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();

ObjectNode tweets = ((ObjectNode) result.getRequest().getAttribute("tweets"));

String query = tweets.get("query").toString();
String nextToken = tweets.get("meta").get("next_token").toString();

mockMvc.perform(MockMvcRequestBuilders.post("/next")
                    .param("query", query)
                    .param("next_token", nextToken)
                    .accept(MediaType.APPLICATION_JSON))
                    .andExpect(status().isOk())
                    .andExpect(jsonPath("$.isError", is("N")))
                    .andReturn();

如果查询是 "#GoGreen" 并且 next_token 是 "wefw234234ewf234" 在控制器中收到是 查询 = "\"#GoGreen\"" 和 next_token = "\"wefw234234ewf234\""

    @PostMapping("/next") @ResponseBody
    public ResponseEntity<Object> nextPageTrendingTweets(@RequestParam("query") String query,
                                                         @RequestParam("next_token") String nextToken)

也许我在初始化时遗漏了一些东西 mockMvc。我搜索了这个问题,但找不到任何解决方案。

片段部分 (#foo) 完全存在于浏览器中,不会在 HTTP 请求中传递。根本不发。

问题不在于 mockMvc,而在于您如何从 ObjectNode“tweets”中提取数据。您已使用 .toString() 方法获取字符串数据。但是,这是不正确的,因为 ObjectNode.get() 方法 returns 对象和 .toString() 将其转换为字符串表示形式,这就是额外引号的原因。所以问题的解决方案是使用 ObjectNode.get().asText() 方法,该方法将 return 对象中的确切字符串而不进行任何修改或转换。