WebMvc Test无法触发依赖库中的异常处理器,该如何解决?
解决WebMvcTest无法触发依赖库异常处理器的问题
问题核心在于**@WebMvcTest是切片测试**,它默认只会加载当前测试类所在包、指定控制器以及Spring MVC核心组件,依赖库中标注了@RestControllerAdvice/@ControllerAdvice的异常处理器不在默认扫描范围内,导致测试上下文未加载该处理器,抛出异常时无法被自动处理。
给你两种直接有效的解决方式:
方式一:显式导入异常处理器类
找到依赖库中处理CustomException的异常处理器类(比如名为GlobalExceptionHandler),在测试类上用@Import注解将其导入测试上下文:
@WebMvcTest(controllers = MyController.class, excludeAutoConfiguration = { SecurityAutoConfiguration.class}) @ExtendWith(SpringExtension.class) @Import(GlobalExceptionHandler.class) // 导入依赖库的异常处理器类 public class WebMockTest { @Autowired private MockMvc mockMvc; @MockBean private MyService service; @Test public void shall_make_get_call_404_not_ok() throws Exception { when(service.getById(any())).thenThrow(new CustomException("Not found")); this.mockMvc.perform(get("/items/" + "12")).andDo(print()) .andExpect(status().isNotFound()); } }
方式二:扫描依赖库的异常处理器包
如果依赖库包含多个相关异常处理组件,可通过@ComponentScan指定依赖库的包路径,让Spring扫描并加载这些组件:
@WebMvcTest(controllers = MyController.class, excludeAutoConfiguration = { SecurityAutoConfiguration.class}) @ExtendWith(SpringExtension.class) @ComponentScan(basePackages = "com.dependency.lib.exception") // 替换为依赖库异常处理器所在包路径 public class WebMockTest { // 原代码不变 }
优先推荐方式一,方式二可能会扫描到依赖库中无关组件,导致测试上下文冗余,影响测试效率。
内容的提问来源于stack exchange,提问作者Patan
相关产品推荐
相关产品推荐

