【问题标题】:Expecting exception during MockMVC.perform in JUnit5在 JUnit5 中的 MockMVC.perform 期间预期异常
【发布时间】:2021-01-26 00:11:07
【问题描述】:

这可能是一个重复的问题。但是我浏览了一些 10-15 个相关的帖子和​​相关的回复,这些都没有解决我的问题。我面临的问题如下 我有一个带有自定义 ApplicationException 的 SpringRest 控制器类。 我已经为我的控制器编写了一个 Junit,下面是我遇到问题的 sn-p。

this.mockMvc.perform(MockMvcRequestBuilders.post(url)
        .contentType(MediaType.APPLICATION_JSON)
        .content(new ObjctMapper().writeValueAsString(requestObject)
        .headers(header)
        .accept(MediaType.APPLICATION_JSON)
    )
    .andDo(print())
    .andExpect(status().is4xxClientError());

当我执行测试方法时,我看到代码中抛出了 ApplicationException,但是 Junit 失败了,我在 Junit Console 中看到的是

"org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.abc.pmr.case.exception.ApplicationException at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
...
...
Caused by: com.abc.pmr.case.exception.ApplicationException
    at com.abc.pmr.case.exception.ApplicationException

我也试过.andExpect(mvcresult -> assertTrue(mvcresult.getResolvedException() instanceof ApplicationException));。 但这也无济于事。

Junit 因上述异常而失败,而我想将具有预期异常的 Junit 作为 ApplicationException 传递。 注意:该类所有成功场景测试用例均通过成功。

我们将不胜感激。

【问题讨论】:

  • 你的异常有处理逻辑吗?你试过getResolvedException,但它只会从docsReturn any exception raised by a handler and successfully resolved through a HandlerExceptionResolver.
  • 是的,我确实有一个异常处理程序,它进一步调用一个转换器类,该类构建完整的错误响应以及错误代码、错误消息等。
  • 您能在此处添加您的异常处理程序列表吗?
  • 您确定,您的控制器抛出的异常在 400 范围内吗?可以请添加它抛出异常的Api的响应吗?
  • @evg_ny 将很快分享处理程序代码。

标签: java spring-boot spring-mvc junit5


【解决方案1】:

我想您的mockMvc 设置对于您的情况并不完全正确。 确保你已经为你的 mockMvc 设置了异常处理程序。 您可以找到有关此here 的更多信息。

因此,当您的环境配置正确时,您将有能力测试此逻辑。

【讨论】:

  • 太好了,让我知道情况如何。
  • 太棒了!你在现场!唯一的问题是我看到了在 MockMVC 中设置异常处理程序的不同方法。早些时候我写了一个没有用的。工作的在下面this.mockMvc = MockMvcBuilders.standaloneSetup(autowiredController).setControllerAdvice(autowiredExceptionHandler).build(); 也是在课堂上,我必须包括以下@ContextConfiguration(classes = {MyController.class, Services.class, ApplicationException.class, ExceptionHandler.class, ErrorTransformer.class}) 再次感谢!
  • 这个链接给了我确切的sn-p。 stackoverflow.com/questions/15302243/…
  • 酷,所以,在这里给出具体的完整解决方案非常困难,因为我不知道你的完整环境和弹簧设置。但无论如何,如果它对您有所帮助 - 请将此标记为已接受的答案。
  • 我同意。我应该给你@BeforeEach 方法的内容,因为那会给你更好的主意。但无法分享太多细节,因为其中大部分是专有的。所以在削减这些部分的过程中,我也可能错过了所需的部分。不管……现在一切都好。公认!谢谢!
猜你喜欢
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 2016-06-12
  • 2021-11-28
相关资源
最近更新 更多