我们正在使用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
时没有嵌入式服务器造成的,如果有,是否有更好的解决方案?
谢谢你。