【问题标题】:Mockito throws InvalidUseOfMatchersException for "verify()"Mockito 为“verify()”抛出 InvalidUseOfMatchersException
【发布时间】:2020-03-12 12:13:10
【问题描述】:

我想在我的应用程序中测试 API 调用。因为 API 调用是异步的。我正在使用 mockito(verify 和 ArgumentCaptor)。

@Captor
lateinit var callbackCaptor: ArgumentCaptor<Callback<ResponseModel>>

 @Test
 fun testDetailsApiCall() {
    val mock: MyRepository = mock()
    verify(mock.getSomeDetails("xxx", "xxx", capture(callbackCaptor)))
 }

MyRepository 内部的getSomeDetails 正在调用服务器 API 调用并通过 interface 回调发送回响应。

但是当我执行这个测试用例时,我得到了以下错误

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
3 matchers expected, 1 recorded:
-> at xxx.xxxx.testDetailsApiCall

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

For more info see javadoc for Matchers class.

如果你们能找出其中的问题,那将是非常有帮助的

【问题讨论】:

  • 您是否尝试过使用eq("xxx") 而不仅仅是"xxx"?由于您使用的是捕获...
  • @Demigod getDetails 方法需要字符串参数

标签: android asynchronous testing kotlin mockito


【解决方案1】:

如果您使用参数调用验证某些方法,您可以对 所有 参数使用匹配器(如 any()、eq() 等),或者改用精确值。你不能同时混合两者。 所以不要使用"xxx",而是使用eq("xxx")。

而且,我认为您使用的是verify() 方法,而不是应该使用的方法。它的语义应该如下:verify(mock).method().

尝试将您的验证方法更改为:

verify(mock).getSomeDetails(eq("xxx"), eq("xxx"), capture(callbackCaptor))

【讨论】:

  • 需要但未调用:AppDetailsRepositoryImpl.getSomeDetails("xxx", "xxx", ); -> 在 jp.pay2.android.sdk.network.apis.MiniAppDetailsTest.testDetailsApiCall 实际上,与此模拟的交互为零。这是我得到的错误
  • @droidev,这实际上是你的逻辑错误,因为你的代码没有调用这个函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多