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());
}
Share:
22,514
Denis Stephanov
Author by

Denis Stephanov

Updated on July 11, 2022

Comments

  • Denis Stephanov
    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.