使用“MockMvc”测试时,Spring boot“ErrorController”不会被调用

kev*_*jom 5 spring spring-test spring-test-mvc spring-boot

我们正在使用 spring boot (v1.3.3.RELEASE) 构建一个项目,我们有一个自定义的 ErrorController ,如下所示

@RestController
@RequestMapping("/error")
public class GlobalErrorController extends AbstractErrorController {
    @Autowired
    public GlobalErrorController(ErrorAttributes errorAttributes) {
        super(errorAttributes);
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }

    @RequestMapping(produces = MediaType.ALL_VALUE)
    public ResponseEntity error(HttpServletRequest request) {
        HttpStatus status = getStatus(request);
        if (status.is5xxServerError()) {
            //log maybe
        }
        return new ResponseEntity(status);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我们启动Spring Boot应用程序并尝试通过curl或浏览器访问它时,我们发现它运行良好,它只响应状态代码而没有正文(内容)。

但是当我们尝试为这个控制器编写集成测试时,我们发现ErrorController永远不会被调用,一些示例代码如下:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {MyApplication.class, TestConfiguration.class})
@WebAppConfiguration
public class GlobalErrorControllerIntegrationTest {
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext wac;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();

    }

    @Test
    public void shouldRespondWithServerErrorButNoContent() throws Exception {
        mockMvc.perform(get("/test/err")).andExpect(status().is5xxServerError()).andExpect(content().string(""));
    }

}
Run Code Online (Sandbox Code Playgroud)

MyApplication 是用 @SpringBootApplication 注解的应用程序的入口,而 TestConfiguration 是一些测试装置,将用于帮助运行测试,它看起来像这样:

 @Configuration
 @ComponentScan("com.my.test.fixtures")
 public class TestConfiguration {
 }
Run Code Online (Sandbox Code Playgroud)

我们还有一个测试控制器,它会引发错误

@RestController
public class TestErrorController {
    @RequestMapping("/test/err")
    public int raiseError() {
        return 1 / 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙找出问题所在吗?

是否是由于使用spring时没有嵌入服务器导致的TestContext,如果是,有没有更好的解决方案?

提前致谢。