JUnit中Mock Sheet时触发InvalidUseOfMatchersException异常求助
解决Mockito Mock泛型参数方法的异常问题
错误原因
你触发的org.mockito.exceptions.misusing.InvalidUseOfMatchersException,核心原因是匹配器类型与方法参数的泛型类型不兼容:原方法第二个参数是List<String>,直接使用Mockito.any()会导致Mockito无法正确推断泛型类型,进而触发匹配器使用异常。
正确Mock写法
以下几种写法都可以解决问题,按精度从高到低排序:
1. 指定泛型类型的匹配器(最精确)
when(readAndProcessPricingSchemeUtils.loadPricingSchemeDto( Mockito.any(Sheet.class), Mockito.anyListOf(String.class) )).thenReturn(pricingSchemesDTOList);
2. 指定参数的类类型
如果不需要严格匹配泛型,也可以直接指定List的类类型:
when(readAndProcessPricingSchemeUtils.loadPricingSchemeDto( Mockito.any(Sheet.class), Mockito.any(List.class) )).thenReturn(pricingSchemesDTOList);
3. 静态导入匹配器简化代码
先导入ArgumentMatchers的静态方法:
import static org.mockito.ArgumentMatchers.*;
然后简化Mock代码:
when(readAndProcessPricingSchemeUtils.loadPricingSchemeDto(any(Sheet.class), anyListOf(String.class))) .thenReturn(pricingSchemesDTOList);
额外注意事项
- 确保
readAndProcessPricingSchemeUtils是通过@Mock注解或Mockito.mock()方法创建的Mock实例,而非真实对象 - 所有参数必须统一使用匹配器,不能混合使用匹配器和真实参数(比如不能一个参数用
any(),另一个传真实的List<String>对象)
内容的提问来源于stack exchange,提问作者Vasavi
相关产品推荐
相关产品推荐

