martine
martine

Reputation: 79

mockMVC method GET java.lang.AssertionError: Status Expected :200 Actual :500

i written a test in spring mockMVC this method:

my method testing is:

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

and i have a following bug:

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

This is my POST method test:

what is bad in my test method? what i can fixed this?

I am asking for help and quick answer

Upvotes: 1

Views: 11424

Answers (1)

TwiN
TwiN

Reputation: 3824

It appears you're not looking at the right place for the issue.

The logger outputs that you have an error with the request URI /users/1:

Request URI = /users/1

and your testing method is trying to get /account/1:

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

As for the error itself, MethodArgumentTypeMismatchException:

Exception that indicates that a method argument has not the expected type.

In other words, the method which is annotated by @GetMapping("/users/{id}") has the wrong @PathVariable parameter type.

In your case, you're using UUID as parameter:

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

However, in your test, you're not passing a UUID, you're passing a numerical value (long/int) in your test.

If you want to generate a random UUID, you can use UUID.randomUUID():

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

Alternatively, you could use long instead of uuid in your mapping method:

@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());
}

though in that case, you'll probably have to change your AccountService.retrieveById(id) method.

Good luck!

Upvotes: 1

Related Questions