【问题标题】:doThrow Exception not throwing for spring MVC unit test?春季MVC单元测试不抛出doThrow异常?
【发布时间】:2020-05-04 15:57:57
【问题描述】:

我尝试切换到 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 响应。

【问题讨论】:

  • 您能否确保您的被测系统中的write(...) 不被null 调用? any() 将不匹配 null。顺便说一句:您应该输入any()-matcher,例如any(Request.class)(或任何适用的)。
  • 是的,我通常键入匹配器类,但只是试图概括问题并删除我的 POJO 名称......但是,是的,当我调试时,“请求”不为空,所以它不会被调用null (也没有显示 null 检查,防止 null 被传递给 write() 方法
  • @Turing85 lmk 如果您对解决方案有任何想法...我想知道 MVC 单元测试和监视方法是否存在一些扭结或限制
  • 不,抱歉。我是空白的。必须在调试器中自己查看程序。
  • @Turing85 我的意思是我在下面发布的解决方案......直接调用处理程序方法而不是使用 mockmvc

标签: java spring exception junit mockito


【解决方案1】:

我发现我可以让测试通过直接调用函数......看起来 MockMvc 没有包含 doThrow 逻辑

修订单元测试:

doThrow(new Exception("some error")).when(handler).sendToSqsWriter(any());

ResponseEntity<String> response = controller.handleRequest(new Gson().fromJson(new JSONObject(mockApptRequestBody);.toString(), SeamAppointmentRequest.class));

assertTrue(response.toString().contains("some error"));
assertTrue(response.getStatusCodeValue() == 503);

所有的 json/gson jazz 都在解决运行时解析错误

【讨论】:

    【解决方案2】:

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

    我的原始帖子中没有这个 sn-p,但 handler 在测试中被实例化如下:

    @Mock
    EventHandler handler;
    

    必须是:

    @MockBean 
    EventHandler handler;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多