java - 春季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 响应。
解决方案
所以我找到了我的问题的正确答案:
我的原始帖子中没有这个片段,但是handler
在测试中被实例化是这样的:
@Mock
EventHandler handler;
它必须是:
@MockBean
EventHandler handler;
我的猜测是因为@MockBean
是 spring 模拟,并且@Mock
来自 Mockito,它可能是在模拟一个在 Spring 容器之外实例化的事件处理程序。因此,为什么我不认为它正在拾取 doThrow ...它确实拾取了它,但监视了错误的实例。
推荐阅读
- css - 为什么 WebKit 浏览器在 100% 缩放时会计算不同的大小?
- jquery - 当我们使用 jQuery Migrate 升级版本并且不替换已弃用的方法时,jQuery 是否仍然存在 XSS 漏洞?
- c++ - SFINAE | 奇怪的行为
- python - DataFrame Pandas 重复日期问题
- python - 如何按列对二维列表进行排序?
- swift - 是否可以快速编辑 UILabel ?
- amazon-web-services - Traefik 在第 4 层 AWS 遗留网络负载均衡器背后——如何将请求者 IP 地址添加到访问日志中
- jquery - 通过单击导航到元素来关闭 Bootstrap 模式
- html - 当对齐项设置为拉伸以外的任何其他值时,flex-wrap 不适用于列
- graphene-django - 有没有办法优雅地使用 django 模型作为输入对象类型?