如何在Mockito中匹配特定泛型类型List<User>完成mock设置
正确实现方案
Java泛型存在运行时类型擦除机制,不会保留List的泛型参数类型信息,因此不存在anyList(User.class)或者any(List<User>.class)这类直接的语法。你可以用以下两种成熟方案实现需求:
方案1:强转any()匹配器(最简常用方案)
// 压制unchecked编译警告,业务上可以确认匹配的就是List<User>类型 @SuppressWarnings("unchecked") @Test void testYourInterface() { // 构造测试用返回的User对象 User mockReturnUser = new User(); // 可按需给mockReturnUser设置属性值 // 核心匹配逻辑:将any(List.class)强转为List<User>类型 Mockito.when(service.getYoungestUser(anyInt(), (List<User>) any(List.class))) .thenReturn(mockReturnUser); // 后续测试逻辑 }
注意:你原有写法的返回值存在类型错误:
getYoungestUser方法返回值是单个User对象,不是List<User>,你之前写的thenReturn(Collections.singletonList(new User()))本身就会触发类型不匹配错误。
方案2:参数捕获器校验(需要校验List内元素时使用)
如果你不仅要匹配类型,还要校验传入的List中User元素的内容是否符合预期,可以用ArgumentCaptor实现:
// 声明泛型为List<User>的参数捕获器,推荐用注解方式注入 @Captor private ArgumentCaptor<List<User>> userListCaptor; @Test void testYourInterface() { User mockReturnUser = new User(); Mockito.when(service.getYoungestUser(anyInt(), anyList())) .thenReturn(mockReturnUser); // 执行接口调用逻辑后,捕获传入的List参数 Mockito.verify(service).getYoungestUser(anyInt(), userListCaptor.capture()); List<User> receivedUserList = userListCaptor.getValue(); // 此处可添加断言校验receivedUserList中的元素是否符合要求 }
错误写法说明
你找到的List<User> mocked1 = mock(List.class)是创建一个被Mock的List实例,并不是参数匹配器,不能放到when的方法入参位置作为类型匹配规则使用,你尝试的三种写法都属于对该API的误用。
内容的提问来源于stack exchange,提问作者Sriharsha g.r.v
相关产品推荐
相关产品推荐

