Spring MockMvc - Как проверить запрос на удаление контроллера REST?
Мне нужно проверить мои методы контроллера, включая метод удаления. Вот частичный код контроллера:
@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);
}
}
И вот мой тест:
@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());
}
Тест завершен с ошибкой из-за неправильного кода состояния:
java.lang.AssertionError: Ожидаемый статус:200 Фактический:400
В журнале консоли я также нашел это:
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
Можете ли вы сказать мне, как это исправить? Благодарю.
2 ответа
Ваш целевой URI: /api/foo/11
на основе этого корня: /api/foo
и эта переменная пути: /{id}
,
Когда используешь MockMvc
Вы устанавливаете переменные пути (иначе переменные URI) следующим образом:
delete(uri, uriVars)
Больше подробностей в Javadocs.
Итак, ваш тест должен читать:
@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());
}
Или в качестве альтернативы:
@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());
}
Предыдущий ответ наверняка правильный :) Но если вы хотите проверить код ответа 204:
@Test
public void testFooDelete() throws Exception {
...
.andExpect(status().isNoContent());
}
вы можете явно указать, что должно быть возвращено вашим методом удаления, используя @ResponseStatus:
@RequestMapping(path="/{id}", method = RequestMethod.DELETE)
@ResponseStatus(value = HttpStatus.NO_CONTENT)
public void delete(@PathVariable Long id) {
fooService.delete(id);
}