java - doThrow 异常不抛出 Spring MVC 单元测试?

标签 java spring exception junit mockito

我尝试切换到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/

相关文章:

java - 选择查询中的 Derby 溢出

java - 使用自引用数组,多边形是不可见的

java - 分析具有未知架构的 XML

java - 无法解析 URI 的方法 'resolve'

Python assertRaises 处理用户定义的异常

java - 我应该始终使用 Lambda 表达式进行异常测试吗?

c# - 在 try..catch 中获取异常对象以包含完整的堆栈跟踪,目前它已被截断

java - 我可以使用 FileChooser (javafx) 将序列化对象保存在文件中吗?

java - 使用 PowerMockito 测试框架进行 junit 测试时如何将接口(interface)引用注入(inject) Spring Controller?

spring - 我们可以编写一个没有 ItemReader 和 ItemWriter 的 Spring Batch 作业吗