Mockito按入参类型返回不同mock值时stub顺序异常如何解决?
Mockito按参数类型返回不同值的配置方案
问题原因
Mockito的Stub规则遵循后定义优先原则,当多个匹配规则同时命中一次方法调用时,会触发最后注册的规则。
你当前的写法中,any(DTable.class)匹配的参数也完全满足any()的匹配条件,所以两个规则总有一个会覆盖所有场景:
- 若
any(DTable.class)写在后面:所有调用都会命中后定义的规则,无论参数是不是DTable都返回false - 若
any()写在后面:所有调用都会命中最后定义的通用规则,全返回true
另外Mockito 1.x版本中any(Class<T>)仅做类型强转、不校验参数实际类型,也会导致类型匹配失效。
解决方案
方案一:使用isA()类型匹配(适配Mockito 2+版本)
isA(Class<T>)会严格校验参数的实际类型,调整Stub顺序为先写通用规则,再写具体类型规则即可实现预期效果:
// 先定义通用匹配规则:非DTable类型返回true Mockito.when(tableVerificationService.verify(Mockito.any())).thenReturn(true); // 后定义具体类型规则:DTable类型返回false,优先级更高 Mockito.when(tableVerificationService.verify(Mockito.isA(DTable.class))).thenReturn(false);
方案二:使用thenAnswer主动判断类型(全版本兼容)
直接在回调中判断入参类型,逻辑更直观,不会受Stub顺序和Mockito版本影响:
Mockito.when(tableVerificationService.verify(Mockito.any())).thenAnswer(invocation -> { Object param = invocation.getArgument(0); // 是DTable类型返回false,其余返回true return !(param instanceof DTable); });
如果需要兼容DTable类型的null值,可以额外增加空值判断逻辑。
内容的提问来源于stack exchange,提问作者Ruslan
相关产品推荐
相关产品推荐

