Spring MockMvc - How to test delete request of REST controller?
22,514
Your target URI is: /api/foo/11
based on this root: /api/foo
and this path variable: /{id}
.
When using MockMvc
you set path variables (aka URI variables) like so:
delete(uri, uriVars)
More details in the Javadocs.
So, your test should read:
@Test
public void testFooDelete() throws Exception {
this.mockMvc.perform(MockMvcRequestBuilders
.delete("/api/foo/{id}", "11")
.contentType(MediaType.APPLICATION_JSON))
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
}
Or alternatively:
@Test
public void testFooDelete() throws Exception {
this.mockMvc.perform(MockMvcRequestBuilders
.delete("/api/foo/11")
.contentType(MediaType.APPLICATION_JSON))
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
}
Author by
Denis Stephanov
Updated on July 11, 2022Comments
-
Denis Stephanov almost 2 years
I need to test my controller methods including a delete method. Here is partial controller code:
@RestController @RequestMapping("/api/foo") public class FooController { @Autowired private FooService fooService; // other methods which works fine in tests @RequestMapping(path="/{id}", method = RequestMethod.DELETE) public void delete(@PathVariable Long id) { fooService.delete(id); } }
And here is my test:
@InjectMocks private FooController fooController; @Before public void setUp() { this.mockMvc = MockMvcBuilders.standaloneSetup(fooController) .setControllerAdvice(new ExceptionHandler()).alwaysExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")).build(); } @Test public void testFooDelete() throws Exception { this.mockMvc.perform(MockMvcRequestBuilders .delete("/api/foo") .param("id", "11") .contentType(MediaType.APPLICATION_JSON)) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); }
Test finish with failure because incorrect status code:
java.lang.AssertionError: Status Expected :200 Actual :400
In console log I also found this:
2017-12-11 20:11:01 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - DispatcherServlet with name '' processing DELETE request for [/api/foo] 2017-12-11 20:11:01 [main] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /api/foo 2017-12-11 20:11:01 [main] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported 2017-12-11 20:11:01 [main] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Invoking @ExceptionHandler method: public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> cz.ita.javaee.web.controller.error.ExceptionHandler.handleException(java.lang.Exception) 2017-12-11 20:11:01 [main] DEBUG o.s.w.s.m.m.a.HttpEntityMethodProcessor - Written [{stackTrace=org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported
Can you tell me how to fix it? Thanks.