代码之家  ›  专栏  ›  技术社区  ›  harshs08

SpringBoot测试自定义错误控制器

  •  1
  • harshs08  · 技术社区  · 7 年前

    听从这里的建议 Spring Boot Remove Whitelabel Error Page

    @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错误响应的简单类。

    {
      "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 自定义错误控制器
    2. 我是否错误地测试了错误行为。如果是这样,我如何测试自定义错误响应?
    1 回复  |  直到 7 年前
        1
  •  1
  •   Makoto    7 年前

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

    // Elsewhere...
    @Autowired
    private TestRestTemplate template;
    
    // In your tests...
    ErrorJson result = template.getForObject("/error", ErrorJson.class);
    
    // Inspect the result!