我想测试当REST控制器返回错误请求时DefaultErrorAttributes
的消息。控制器会抛出一个QueryException
,由ControllerAdvice
处理。
@ControllerAdvice
public class ErrorHandlingControllerAdvice {
@ExceptionHandler(QueryException.class)
void onApplicationException(QueryException e, HttpServletResponse response) throws IOException {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
}
}
响应内容:
{
"timestamp": "2018-12-04T17:05:37.403+0000",
"status": 400,
"error": "Bad Request",
"message": "Query error message",
"path": "/search/v1/query/x"
}
WebMvcTest
测试会在上下文中加载 ControllerAdvice
,可以正确处理异常(我用断点检查过)。但问题是响应的内容为空。断言 content().string("")
虽然通过了,但实际上不应该这样。
@SpringJUnitConfig({QueryResource.class, ErrorHandlingControllerAdvice.class})
@WebMvcTest(QueryResource.class)
public class QueryResourceTest {
@Autowired
private MockMvc mvc;
@Test
public void testQuery() throws Exception {
String xmlQuery = ResourceHelper.loadResource("/rest/query.xml");
this.mvc.perform(post("/v1/query/test")
.contentType(MediaType.APPLICATION_XML)
.content(xmlQuery))
.andExpect(status().isBadRequest())
.andExpect(content().string(""))
.andExpect(jsonPath("$.message", is("Query error message")));
}
}
ControllerAdvice
返回的DefaultErrorAttributes
对象的JSON表示形式。 - Sydney