You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mockito测试Controller时Page返回null,getBoardList方法未触发

问题排查与解决方案

针对你遇到的Mockito测试中getBoardList方法未被调用的问题,从代码细节出发可以定位到几个核心原因,对应修复方案如下:

1. 参数匹配规则不匹配

你在桩设置中使用了eq(null)来匹配BoardDto.Request参数,但Spring MVC处理GET请求时,即使没有传递任何参数,也会通过反射实例化一个空的BoardDto.Request对象(而非直接传入null),导致你的桩规则完全不匹配,Mockito只能返回默认的null值,同时后续的验证断言自然失败。

修复方式:
将桩设置中的eq(null)替换为any(BoardDto.Request.class),匹配任意BoardDto.Request实例(包括null和空对象):

when(postService.getBoardList(any(BoardDto.Request.class), any(Pageable.class))).thenReturn(mock);

2. 参数校验提前终止方法执行

Controller方法中的@Valid注解会触发BoardDto.Request的参数校验,如果该DTO类中存在@NotNull、@NotBlank等强制校验规则,而你的测试请求没有传递符合要求的参数,校验会直接失败,Spring MVC会跳过后续的postService.getBoardList调用,直接返回错误响应。

验证与修复:

  • 临时注释掉@Valid注解,重新运行测试,确认服务方法是否能被正常调用;
  • 如果确实是校验问题,要么在测试请求中传递符合校验规则的参数,要么在测试类中添加@MockBean Validator来替换默认校验器,跳过校验逻辑。

3. MockBean未正确生效

确保你的测试类使用了@WebMvcTest(你的BoardController类名)注解,该注解会自动配置Spring MVC测试环境,并将@MockBean声明的PostService注入到Controller中,替换掉真实的PostServiceImpl实例。如果使用@SpringBootTest则需要手动配置MockMvc,并确保MockBean覆盖真实Bean。

示例完整测试类结构:

@WebMvcTest(BoardController.class)
class BoardControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private PostService postService;

    @Test
    void getBoardListView() throws Exception {
        Page<BoardDto.Response> mock = Mockito.mock(Page.class);
        when(postService.getBoardList(any(BoardDto.Request.class), any(Pageable.class))).thenReturn(mock);

        mockMvc.perform(get("/board").with(csrf()))
                .andExpect(status().isOk())
                .andExpect(content().contentTypeCompatibleWith(MediaType.TEXT_HTML))
                .andExpect(model().attributeExists("boardList"))
                .andExpect(view().name("board/index"));

        then(postService).should().getBoardList(any(BoardDto.Request.class), any(Pageable.class));
    }
}

内容的提问来源于stack exchange,提问作者Byeongsu KIM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:45:32