使用@WebMvcTest测试控制器时需Mock无关Bean的原因及解决方案
问题根因
你对@WebMvcTest的使用方式存在错误。@WebMvcTest默认会扫描项目中所有的@Controller、@RestController类加载到测试上下文,而非仅加载你目标测试的控制器。因此哪怕你只测试UsersController,上下文初始化时也会尝试创建BooksController的实例,而你没有为BooksController依赖的LibraryBookService提供对应Bean,自然就会抛出依赖缺失的异常。
解决方案
@WebMvcTest原生支持指定要加载的控制器范围,你只需要在注解中显式声明你要测试的控制器类即可,Spring只会加载指定的控制器,不会扫描其他无关控制器,也就不会触发无关的依赖检查:
// 显式指定仅加载UsersController到测试上下文 @WebMvcTest(UsersController.class) class UsersControllerTest { @Autowired MockMvc mvc; @MockBean DataService dataService; @BeforeEach void resetMocks() { Mockito.reset(this.dataService); } // ... }
如果需要同时测试多个控制器,也可以传入类数组:@WebMvcTest({UsersController.class, XXXController.class})。该方案完全不会受后续新增控制器的影响,不需要添加多余的MockBean。
内容的提问来源于stack exchange,提问作者Roddy of the Frozen Peas
相关产品推荐
相关产品推荐

