使用`MockMvc`进行测试时,不会调用Spring启动`ErrorController`

时间:2016-04-18 09:57:26

标签: spring spring-boot spring-test spring-test-mvc

我们正在使用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);
    }
}

我们发现它在启动Spring启动应用程序时运行良好,并尝试通过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(""));
    }

}

MyApplication是使用@SpringBootApplication注释的应用程序的条目,TestConfiguration是一些测试装置,用于帮助运行测试,它看起来像这样:

 @Configuration
 @ComponentScan("com.my.test.fixtures")
 public class TestConfiguration {
 }

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

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

有人可以帮忙弄明白这个问题吗?

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

谢谢你。

0 个答案:

没有答案