我尝试切换到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 响应。
最佳答案
所以我找到了问题的正确答案:
我在原来的帖子中没有这个片段,但是处理程序
在测试中被实例化,如下所示:
@Mock
EventHandler handler;
它需要是:
@MockBean
EventHandler handler;
我的猜测是,由于@MockBean
是spring模拟,而@Mock
来自Mockito,它可能是在模拟在Spring容器外部实例化的事件处理程序。因此,为什么我不认为它正在拾取 doThrow ...它确实拾取了它,但监视了错误的实例。
关于java - doThrow 异常不抛出 Spring MVC 单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59792837/