易山川 2017-11-09 14:20 采纳率: 0%
浏览 1861

MockMvc post请求异常

MockHttpServletRequest:
HTTP Method = POST
Request URI = /commodity
Parameters = {}
Headers = {Content-Type=[*/*], Accept=[*/*]}

Handler:
Type = null

Async:
Async started = false
Async result = null

Resolved Exception:
Type = org.springframework.web.HttpRequestMethodNotSupportedException

ModelAndView:
View name = null
View = null
Model = null

FlashMap:
Attributes = null

MockHttpServletResponse:
Status = 405
Error message = Request method 'POST' not supported
Headers = {Allow=[DELETE, GET]}
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 03:55
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在使用MockMvc进行HTTP POST请求时,可能会遇到org.springframework.web.HttpRequestMethodNotSupportedException的异常。这个异常通常发生在尝试发送不支持的HTTP方法(例如:PUT、DELETE等)时。

    要解决这个问题,你需要确保你的测试环境支持你正在测试的HTTP方法。如果Spring MVC框架无法处理特定的HTTP方法,请考虑以下解决方案:

    1. 修改URL: 如果URL中包含了一个不支持的HTTP方法,你可以通过重写URL来避免问题。例如,如果你想要发送一个GET请求到一个URL,但实际期望的是一个POST请求,那么你应该将URL重定向为POST类型:

      mockMvc.perform(MockMvcRequestBuilders.post("/some_url")
                        .contentType(MediaType.APPLICATION_JSON)
                        .accept(MediaType.APPLICATION_JSON))
          .andExpect(status().isOk());
      
    2. 修改请求参数: 如果URL是固定的,但你想改变请求的方法,你可以直接更改请求参数:

      mockMvc.perform(MockMvcRequestBuilders.post("/some_url")
                        .headers(header -> header.setContentType("application/json"))
                        .content("{ \"param\": \"value\" }"))
          .andExpect(status().isOk());
      
    3. 修改响应内容: 如果服务器端返回的状态码不是405(Not Implemented),而是其他状态码,可以修改响应内容以实现预期的行为:

      mockMvc.perform(MockMvcRequestBuilders.post("/some_url")
                        .headers(header -> header.setContentType("application/json"))
                        .content("{ \"response\": \"Success\" }"))
          .andExpect(status().isOk());
      
    4. 修改业务逻辑: 如果以上方法都无法解决问题,可能是因为你的应用层或服务层存在问题。在这种情况下,你可能需要检查你的应用程序是否有错误地处理了HTTP方法,或者是否正确地实现了对这些方法的支持。

    5. 更新依赖库: 如果你使用的第三方库没有提供正确的支持,你也可能需要更新这些库以适应新的需求。

    6. 使用mockito替代: 如果上述所有方法都无法解决问题,可能需要使用JUnit的Mockito库来进行单元测试,它允许你创建和管理模拟对象,并捕获它们的行为。这将帮助你在运行测试之前验证你的应用程序是否能够处理不同的HTTP方法。

    import static org.mockito.Mockito.*;
    
    class YourController {
    
        @Autowired
        private MockMvc mockMvc;
    
        // ...
    
        public void testPostMethod() throws Exception {
            // ...
        }
    }
    

    这样,你就可以用Mockito来创建一个模拟的对象,并设置其行为以模拟特定的HTTP方法。

    @Mock
    private MockHttpServletRequest mockRequest;
    @Mock
    private MockHttpServletResponse mockResponse;
    
    // ...
    
    @PostMapping("/your-url")
    public ResponseEntity<?> yourFunction(@RequestBody Map<String, String> requestBody) {
        return ResponseEntity.ok();
    }
    

    注意:在上面的例子中,我们使用了Mockito的@Mock注解来创建模拟对象,并使用@Mock注解来设置模拟对象的行为。然后我们在testPostMethod()方法中使用了when()thenReturn()来模拟请求和响应。

    评论

报告相同问题?

悬赏问题

  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库