显然我有这样的情况,客户端想要将整数值传递给 REST 端点之一。长得像
@PostMapping("/handleSignal")
public ResponseEntity<Object> handleSignal(@RequestParam @NotNull Integer signalId)
我已经使用过
@RequestParam
,并通过Postman测试成功。但是,在使用 Spring MockMvc
进行测试时,我还没有找到任何方法来传递 Integer 值。到目前为止我的尝试是
RequestBuilder handleSignalRequest = MockMvcRequestBuilders.post("/handleSignal") .requestAttr("signalId", 1); mockMvc.perform(handleSignalRequest) .andExpect(MockMvcResultMatchers.status().isOk());
但这不会达到终点并给我
400/Bad Request
.
我知道如果我将方法签名更改为
@PostMapping("/handleSignal")
public ResponseEntity<Object> findSignal(@RequestAttribute(name = "signalId") @NotNull Integer signalId)
然后使用
MockMvc
的测试将通过(尝试过)。但在那种情况下,我将失去通过 Postman 对其进行测试的能力。
什么是理想的解决方案,以便能够通过 Postman 和 Spring MockMvc 对其进行测试?任何领导表示赞赏。
RequestBuilder handleSignalRequest = MockMvcRequestBuilders.post("/handleSignal") .requestAttr("signalId", 1); mockMvc.perform(handleSignalRequest) .andExpect(MockMvcResultMatchers.status().isOk());
MockHttpServletRequestBuilder#requestAttr
错误的方法,正如其名称所示,当您有兴趣使用 signalid 参数发送您的 http post 查询时,就像您对邮递员所做的那样设置请求属性。为了达到预期的结果,您可以使用 MockHttpServletRequestBuilder#param
方法,这样您的请求参数将从查询字符串中解析出来,如下所示,并在您提供的测试中具有预期的行为:
RequestBuilder handleSignalRequest =
MockMvcRequestBuilders.post("/handleSignal")
.param("signalId", "1");