使用 Matchers.anyObject() 验证挂起函数
Verify suspend function with Matchers.anyObject()
我正在尝试将协程添加到我们的 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.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"));
在使用协程时,是否还有其他方法可以验证是否调用了适当的方法?任何帮助将不胜感激。
我尝试使用您提供的代码编写类似的测试。最初,我遇到了与您相同的错误。但是,当我使用mockito-core v2.23.4时,测试通过了
您可以尝试以下快速步骤:
将 testCompile "org.mockito:mockito-core:2.23.4"
添加到 build.gradle 文件中的依赖项列表。
运行 再次测试,应该不会出现类似的错误。
由于 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())
}
}
我正在尝试将协程添加到我们的 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.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"));
在使用协程时,是否还有其他方法可以验证是否调用了适当的方法?任何帮助将不胜感激。
我尝试使用您提供的代码编写类似的测试。最初,我遇到了与您相同的错误。但是,当我使用mockito-core v2.23.4时,测试通过了
您可以尝试以下快速步骤:
将
testCompile "org.mockito:mockito-core:2.23.4"
添加到 build.gradle 文件中的依赖项列表。运行 再次测试,应该不会出现类似的错误。
由于 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())
}
}