首页 文章

mockMVC方法GET java.lang.AssertionError:状态预期:200实际值:500

提问于
浏览
1

我在spring mockVCC中写了一个测试这个方法:

我的方法测试是:

@Test
public void getAccount()throws Exception {
     mockMvc.perform(get("/account/1"))
            .andDo(print())
            .andExpect(status().isOk())
            .andExpect(view().name("/account/"));
}

我有一个以下的错误:

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /users/1
       Parameters = {}
          Headers = {}
             Body = <no character encoding set>
    Session Attrs = {}
Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.method.annotation.MethodArgumentTypeMismatchException

ModelAndView:
        View name = null
             View = null
            Model = null
FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 500
    Error message = null
          Headers = {Content-Type=[text/plain;charset=ISO-8859-1], Content-Length=[14]}
     Content type = text/plain;charset=ISO-8859-1
             Body = We are doomed.
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

java.lang.AssertionError: Status 
Expected :200
Actual   :500

这是我的POST方法测试:

我的测试方法有什么不好?我可以解决这个问题?

我正在寻求帮助并快速回答

1 回答

  • 1

    看来你没有找到适合这个问题的地方 .

    Logger 输出您在请求URI /users/1 时出错:

    Request URI = /users/1
    

    并且您的测试方法正试图获得 /account/1

    mockMvc.perform(get("/account/1"))
    

    至于错误本身,MethodArgumentTypeMismatchException

    异常表示方法参数没有预期的类型 .

    换句话说, @GetMapping("/users/{id}") 注释的方法具有错误的 @PathVariable 参数类型 .

    在您的情况下,您使用UUID作为参数:

    public @ResponseBody ResponseEntity<AccountDTO> getAccount(@PathVariable UUID id) {
    

    但是,在测试中,您没有传递UUID,而是在测试中传递了一个数值(long / int) .

    如果要生成随机UUID,可以使用 UUID.randomUUID()

    @Test
    public void getAccount()throws Exception {
         mockMvc.perform(get("/account/" + UUID.randomUUID()))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(view().name("/account/"));
    }
    

    或者,您可以在映射方法中使用long而不是uuid:

    @GetMapping(value = "/{id}")
    @ApiOperation(value = "Retrieve account.")
    public @ResponseBody ResponseEntity<AccountDTO> getAccount(@PathVariable Long id) {
        return accountService.retreiveById(id).map(ResponseEntity::ok)
                .orElseGet(() -> ResponseEntity.notFound().build());
    }
    

    虽然在这种情况下,您可能需要更改 AccountService.retrieveById(id) 方法 .

    祝好运!

相关问题