gpt4 book ai didi

java - Spring Boot 测试自定义错误 Controller

转载 作者:行者123 更新时间:2023-11-30 06:38:26 29 4
gpt4 key购买 nike

遵循此处的建议Spring Boot Remove Whitelabel Error Page我创建了一个自定义错误 Controller ,以 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错误响应的简单类。

现在我正在尝试编写一个测试,以测试是否命中了不存在的 enpoint,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 = []

所以,我有两个问题:

  1. 为什么内容正文为空。 MockMvc 是否无法找到 CustomErrorController
  2. 我是否错误地测试了错误行为?如果是这样,我如何测试自定义错误响应?

最佳答案

您可以通过 TestRestTemplate 获得更多帮助反而。这不仅允许您进行适当的 URI 调用,还让您有机会将您的响应序列化到它返回的实际对象中,以验证您的正文和其他元素是否确实存在。

简单示例:

// Elsewhere...
@Autowired
private TestRestTemplate template;

// In your tests...
ErrorJson result = template.getForObject("/error", ErrorJson.class);

// Inspect the result!

关于java - Spring Boot 测试自定义错误 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44835723/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com