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
相关产品推荐
相关产品推荐

