得到错误 org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 参数匹配器的使用无效! 1匹配预期,2记录。 如果匹配器与原始值组合,则可能发生此异常: //不正确: someMethod(anyObject(),“raw String”); 使用匹配器时,所有参数都必须由匹配器提供。 例如: //正确: someMethod(anyObject(),eq(“by matcher”));
在
when(
getProgramService
.callService(any(GetProgramType.class)))
.thenReturn(jAXBresponse);
请解释错误和可能的解决方案
答案 0 :(得分:1)
您发布的代码看起来不错;我没有看到它的问题。代码很可能是之前或上面的引起异常。关键在于:
正如您在上面使用的那样,参数匹配器的使用无效! 1匹配预期,2记录。
any
不会返回“特殊类型的null”或“特殊类型的GetProgramType”;那些不存在。 Instead, it returns null and as a side effect puts a matcher on a stack.当检查匹配器时,Mockito会查看堆栈,并检查它是否为空(即检查与所有参数的相等性)或者与您正在检查的调用中的参数数量完全相等(即存在每个论点的匹配器。)
这里发生的事情是你得到一个匹配而不是callService
方法所期望的。当开发人员错误地尝试将匹配器保存在局部变量中时,我经常看到这一点:
String expectedString = Matchers.anyString(); // DOESN'T WORK
// Instead, this just adds a matcher to the stack, almost certainly where it
// doesn't belong.
...或模拟最终方法:
// Assume getProgramService.otherMethod is final.
when(getProgramService.otherMethod(anyString())).thenReturn(123L);
// This actually calls getProgramService.otherMethod(null) and leaves an
// anyString matcher on the stack without setting any expectation that
// would returns 123L.
要确认这是一个问题,请在您发布的语句之前暂时添加此语句:
Mockito.validateMockitoUsage();
这会人工检查堆栈中的匹配器,并可能会在该行上引发异常。如果是,请检查您的帖子上面的代码 。无论哪种方式,在您的问题中添加一些周围的代码都可能有助于我们调试它。