【问题标题】:How to test exceptions handling in @ControllerAdvice如何在@ControllerAdvice 中测试异常处理
【发布时间】:2020-04-21 13:49:28
【问题描述】:

我的应用程序中目前有两个 ControllerAdvice,我应该将它们合并为一个。 但是我需要在合并之前和之后测试它们,测试异常和控制器返回给我的对象。

我正在尝试使用 Mockito 进行 jUnit 测试,但似乎无法在没有任何上下文、没有控制器等的情况下测试异常......

有谁知道我该如何继续实现我想要做的事情?

我也尝试手动抛出异常,但显然它没有被 ControllerAdvice 捕获。

所以基本上这就是我想要做的: 手动抛出异常 此异常由我的 ControllerAdvice 处理 检查返回的对象(代码和消息)

这是我的代码示例:

@Before
public void setup() {
  ...
    mockMvc = MockMvcBuilders.standaloneSetup(getController())
                .setControllerAdvice(new GlobalControllerExceptionHandler())
                .setCustomArgumentResolvers(resolver, resolver_0, resolver_1)
                .setHandlerExceptionResolvers(exceptionResolver).build();
}


@Controller
@RequestMapping("/tests")
public static class RestProcessingExceptionThrowingController {

    @RequestMapping(value = "/exception", method = GET)
    public @ResponseBody String find() {
        throw new EntityNotFoundException();
    }
}

@Test
public void testHandleException() throws Exception {
    mockMvc.perform(get("/tests/exception"))
            .andExpect(new ResultMatcher() {


                @Override
                public void match(MvcResult result) throws Exception {
                    result.getResponse().getContentAsString().contains("global_error_test");
                }
            })
            .andExpect(status().isNotFound());
}

最后我有很好的状态码,但它不使用我的ControllerAdvice(我尝试使用调试器)

【问题讨论】:

    标签: spring mockito mockmvc controller-advice


    【解决方案1】:

    你可以直接调用handler方法

    @ControllerAdvice
    
    MyAdvice{
    
        @ExceptionHandeler(listOfExxcetpions)
        public ResponseEntity someOfMyExceptionsHandler(Exception e){
           .....
         }  
    
    }
    

    测试中

    MuTest{
    private MyAdvice advice=new MyAdvice();
    
    @Test
    public void oneOfTests(){
        Exception e=new SomeSortOfExceptionToTest();
        resp=advice.someOfMyExceptionsHandler(e)
        assertThat(resp).....dostuff;
    }
    
    }
    

    如果您想测试 spring 如何与您的处理程序集成 - 如果您的注释正确,排序序列化等 - 这将是一个集成测试并且您必须启动测试上下文 - 那么您可以直接从控制器方法抛出异常.

    【讨论】:

      猜你喜欢
      • 2022-10-14
      • 2018-07-13
      • 2015-12-15
      • 2014-08-26
      • 1970-01-01
      • 2019-06-04
      • 2019-11-29
      • 2017-06-18
      相关资源
      最近更新 更多