使用Spring MVC测试测试Spring MVC @ExceptionHandler方法

我有以下简单的控制器来捕获任何意外的例外:

@ControllerAdvice
public class ExceptionController {

    @ExceptionHandler(Throwable.class)
    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ResponseEntity handleException(Throwable ex) {
        return ResponseEntityFactory.internalServerErrorResponse("Unexpected error has occurred.", ex);
    }
}

我试图用Spring MVC测试框架编写一个集成测试。这是我到目前为止

@RunWith(MockitoJUnitRunner.class)
public class ExceptionControllerTest {
    private MockMvc mockMvc;

    @Mock
    private StatusController statusController;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.standaloneSetup(new ExceptionController(), statusController).build();
    }

    @Test
    public void checkUnexpectedExceptionsAreCaughtAndStatusCode500IsReturnedInResponse() throws Exception {

        when(statusController.checkHealth()).thenThrow(new RuntimeException("Unexpected Exception"));

        mockMvc.perform(get("/api/status"))
                .andDo(print())
                .andExpect(status().isInternalServerError())
                .andExpect(jsonPath("$.error").value("Unexpected Exception"));
    }
}

我在Spring MVC基础设施中注册了ExceptionController和一个模拟StatusController。
在测试方法中,我设置一个期望从StatusController抛出异常。

异常被抛出,但ExceptionController没有处理它。

我想能够测试ExceptionController获取异常并返回一个适当的响应。

有什么想法为什么这不工作,我该怎么做这种测试?

谢谢。

最佳答案
我刚刚遇到了同样的问题,以下为我工作:

@Before
public void setup() {
    this.mockMvc = MockMvcBuilders.standaloneSetup(statusController)
         .setControllerAdvice(new ExceptionController())
        .build();
}

转载注明原文:使用Spring MVC测试测试Spring MVC @ExceptionHandler方法 - 代码日志