Spring Boot 测试自定义错误控制器
Posted
技术标签:
【中文标题】Spring Boot 测试自定义错误控制器【英文标题】:SpringBoot test custom Errors Controller 【发布时间】:2017-12-03 18:43:15 【问题描述】:按照此处Spring Boot Remove Whitelabel Error Page 的建议,我创建了一个自定义错误控制器,以 json 格式返回自定义错误响应,如下所示
@RestController
public class CustomErrorController implements ErrorController
private static final String PATH = "/error";
@Value("$spring.debug:false")
private boolean debug;
@Autowired
private ErrorAttributes errorAttributes;
@RequestMapping(value = PATH)
ErrorJson error(HttpServletRequest request, HttpServletResponse response)
return new ErrorJson(response.getStatus(), getErrorAttributes(request, debug));
private Map<String, Object> getErrorAttributes(HttpServletRequest request, boolean includeStackTrace)
RequestAttributes requestAttributes = new ServletRequestAttributes(request);
return errorAttributes.getErrorAttributes(requestAttributes, includeStackTrace);
@Override
public String getErrorPath()
return PATH;
其中CustomErrorController
实现ErrorController
和ErrorJson
只是一个用于格式化json 错误响应的简单类。
现在我正在尝试编写一个测试,以测试是否命中了一个不存在的端点,CustomErrorController 会处理它并返回一个带有 json 响应的 404,例如:
"status": 404,
"error": "Not Found",
"message": "No message available",
"timeStamp": "Thu Jun 29 14:55:44 PDT 2017",
"trace": null
我的测试目前看起来像
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class CustomErrorControllerTest
@Autowired
private MockMvc mockMvc;
@Test
public void invalidURLGet() throws Exception
mockMvc.perform(MockMvcRequestBuilders.get("/foo"))
.andExpect(status().is(404))
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
我收到状态为404
的错误响应,但内容主体为空,MockHttpServletResponse
为:
MockHttpServletResponse:
Status = 404
Error message = null
Headers = X-Application-Context=[application:development:-1]
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []
所以,我有两个问题:
-
为什么内容主体为空。
MockMvc
是否找不到 CustomErrorController
。
我是否错误地测试了错误行为。如果是这样,我该如何测试自定义错误响应?
【问题讨论】:
【参考方案1】:您可以使用TestRestTemplate
来获得更多信息。这不仅可以让您进行适当的 URI 调用,还可以让您有机会将您的响应序列化为它返回的实际对象,以验证您的主体和其他元素是否确实存在。
简单示例:
// Elsewhere...
@Autowired
private TestRestTemplate template;
// In your tests...
ErrorJson result = template.getForObject("/error", ErrorJson.class);
// Inspect the result!
【讨论】:
尝试使用TestRestTemplate
,但现在出现以下错误。 ****************************** 应用程序无法启动 ******************* ******** 描述:配置为侦听端口 0 的 Tomcat 连接器启动失败。该端口可能已在使用中,或者连接器可能配置错误。行动:验证连接器的配置,识别并停止正在侦听端口 0 的任何进程,或将此应用程序配置为侦听另一个端口。
那么...您确定为您的测试设置了一个随机端口?我给你的链接中提供了如何做到这一点。
是的,使用@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
以上是关于Spring Boot 测试自定义错误控制器的主要内容,如果未能解决你的问题,请参考以下文章
测试开发专题:spring-boot自定义返回参数校验错误信息
Spring Boot Thymeleaf 自定义验证器不显示错误