Mockito 1.x迁移至3.x:重载方法Matcher匹配问题
Mockito 3.x中重载方法的验证匹配问题解决办法
在从Mockito 1.x迁移到3.x时,遇到MyClass中doSomething(Object)和doSomething(byte[])的重载方法验证歧义问题,使用verify(instance).doSomething(isA(byte[].class))无法区分两个方法,核心原因是类型擦除加上Mockito 3.x对参数匹配器的类型推断逻辑更严格。以下是几种可行的解决办法:
自定义
argThat匹配器明确类型
通过argThat编写自定义匹配逻辑,直接校验参数类型,让Mockito能准确识别目标重载方法:verify(instance).doSomething(argThat(obj -> obj instanceof byte[]));若需要严格匹配(排除子类),可以改为:
verify(instance).doSomething(argThat(obj -> byte[].class.equals(obj.getClass())));通过类型转换强化方法签名识别
对匹配器结果进行显式的byte[]类型转换,给Mockito明确的类型提示,以此区分重载方法:verify(instance).doSomething((byte[]) isA(byte[].class));显式类型转换配合
eq匹配器
如果你能构造出符合条件的byte数组实例,通过显式强转配合eq匹配器,帮助Mockito锁定目标方法:byte[] sampleBytes = new byte[0]; verify(instance).doSomething((byte[]) eq(sampleBytes));
Mockito 3.x对参数匹配的类型校验比1.x更严谨,之前1.x的隐式推断逻辑在3.x中不再适用,以上方法都能有效解决类型擦除导致的重载方法匹配歧义。
内容的提问来源于stack exchange,提问作者thatidiotguy
相关产品推荐
相关产品推荐

