2

我正在尝试将协程添加到我们的 Android 应用程序中,但我在使用我们的模拟框架时遇到了障碍。我的界面有一个暂停功能,如下所示:

interface MyInterface {
  suspend fun makeNetworkCall(id: String?) : Response?
}

这是我尝试验证代码在我的单元测试中执行的方式

runBlocking {
  verify(myInterface).makeNetworkCall(Matchers.anyObject())
}

当我这样做时,我收到以下错误

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
2 matchers expected, 1 recorded:
-> at     com.myproject.MyTest$testFunction$1.invokeSuspend(MyTest.kt:66)

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"));

是否有另一种方法我们应该验证在使用协程时是否调用了适当的方法?任何帮助,将不胜感激。

4

1 回答 1

2

我尝试使用您提供的代码编写类似的测试。最初,我得到了和你一样的错误。但是,当我使用mockito-core v2.23.4时,测试通过了。

以下是您可以尝试的快速步骤:

  1. 添加testCompile "org.mockito:mockito-core:2.23.4"到 build.gradle 文件中的依赖项列表中。

  2. 再次运行测试,你应该不会得到类似的错误。

正如Matchers.anyObject()已弃用的那样,我使用了ArgumentMatchers.any().

下面你可以看到客户端代码:

data class Response(val message: String)

interface MyInterface {
    suspend fun makeNetworkCall(id: String?) : Response?
}

class Client(val  myInterface: MyInterface) {
    suspend fun doSomething(id: String?) {
        myInterface.makeNetworkCall(id)
    }
}

这是测试代码:

class ClientTest {
    var myInterface: MyInterface = mock(MyInterface::class.java)

    lateinit var SUT: Client

    @Before
    fun setUp() {
        SUT = Client(myInterface)
    }

    @Test
    fun doSomething() = runBlocking<Unit> {
        // Act
        SUT.doSomething("123")
        // Verify
        Mockito.verify(myInterface).makeNetworkCall(ArgumentMatchers.any())
    }
}
于 2019-01-13T16:00:42.103 回答