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

Spring Boot 3测试中Mockito模拟泛型Page报错:Cannot select from parameterized type

解决Mockito mock参数化Page类型的问题

你遇到的Cannot select from parameterized type错误,本质是Java泛型的类型擦除机制导致的——编译后Page<EditorRegistration>的泛型信息会被擦除,无法直接获取参数化类型的Class对象,所以Page<EditorRegistration>.class这种写法不合法。

下面是几种实用的解决方法:

  • 强转mock对象
    直接mock原始的Page接口,再强转为泛型类型,代码示例:

    @SuppressWarnings("unchecked")
    Page<EditorRegistration> mockPage = (Page<EditorRegistration>) Mockito.mock(Page.class);
    

    @SuppressWarnings("unchecked")用来消除unchecked cast的编译警告,测试场景下完全可以这么用。

  • 利用Java类型推断简化mock
    Java 8及以上支持类型推断,直接省略Class参数,让编译器自动推断泛型类型:

    Page<EditorRegistration> mockPage = Mockito.mock();
    

    同样可能出现unchecked警告,加注解消除即可。

  • 构造真实的PageImpl实例(推荐)
    如果你的测试需要模拟真实的分页数据,直接用Spring Data提供的PageImpl(Page接口的实现类)构造真实对象,不需要mock:

    // 模拟分页数据列表
    List<EditorRegistration> mockEditorList = List.of(new EditorRegistration(), new EditorRegistration());
    // 构造基础分页对象
    Page<EditorRegistration> mockPage = new PageImpl<>(mockEditorList);
    // 或者指定完整分页参数(页码、每页大小、总条数)
    Page<EditorRegistration> mockPageWithParams = new PageImpl<>(
        mockEditorList, 
        PageRequest.of(0, 10), // 第1页,每页10条
        100 // 总数据量
    );
    

    这种方式更贴近真实业务场景,避免mock接口带来的额外问题,测试逻辑也更可靠。

内容的提问来源于stack exchange,提问作者robert trudel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:32:10