首页 > 解决方案 > 春季MVC单元测试不抛出doThrow异常?

问题描述

我尝试切换到 when() 并得到编译器错误

我在同一个项目的另一个测试中成功使用了 doThrow(...),所以我不知道这里发生了什么

单元测试代码:

doThrow(new Exception("the client cancelled the request, ya dingus!")).when(handler).write(any());

MvcResult result = mockMvc.perform(post("/myPath")
            .content(String.valueOf(mockValidRequest))
            .contentType(MediaType.APPLICATION_JSON)
            .characterEncoding("utf-8"))
            .andExpect(status().is5xxServerError())
            .andReturn();

我正在测试的代码(/myPath 的处理程序方法):

@PostMapping("/myPath")
public ResponseEntity<String> handleRequest(@RequestBody MyPojo request) {
 try {
        handler.write(request);
    } catch (Exception e) {
        return new ResponseEntity<>("Exception thrown during event processing: " + e, HttpStatus.SERVICE_UNAVAILABLE);
    }

return new ResponseEntity<>("Success", HttpStatus.OK)
}

问题是测试表明实际结果是 200 成功,此时应该捕获到异常,并且服务不可用 5xx 响应。

标签: javaspringexceptionjunitmockito

解决方案


所以我找到了我的问题的正确答案:

我的原始帖子中没有这个片段,但是handler在测试中被实例化是这样的:

@Mock
EventHandler handler;

它必须是:

@MockBean 
EventHandler handler;

我的猜测是因为@MockBean是 spring 模拟,并且@Mock来自 Mockito,它可能是在模拟一个在 Spring 容器之外实例化的事件处理程序。因此,为什么我不认为它正在拾取 doThrow ...它确实拾取了它,但监视了错误的实例。


推荐阅读