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

时间:2018-05-13 18:54:51

标签: spring spring-boot junit mockmvc

我在春季mockMVC写了一个测试方法:

我的方法测试是:

@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 个答案:

答案 0 :(得分:1)

您似乎没有找到问题的正确位置。

记录器输出您的请求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)方法。

祝你好运!