【问题标题】:SpringBoot test custom Errors ControllerSpring Boot 测试自定义错误控制器
【发布时间】: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 实现ErrorControllerErrorJson 只是一个用于格式化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 = []

所以,我有两个问题:

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

【问题讨论】:

    标签: java spring-boot junit mockmvc


    【解决方案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)
    猜你喜欢
    • 2018-01-02
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2021-02-08
    • 2022-01-04
    相关资源
    最近更新 更多