MockK - 左匹配器的匹配模拟签名失败:[any(), any()]
MockK - Failed matching mocking signature for left matchers: [any(), any()]
我想实施一些 UI 测试以确保今天实施的代码明天适用,但是当试图查看过去实施的 UI 测试是否有效时,它会抛出此错误:
Caused by: io.mockk.MockKException: Failed matching mocking signature for left matchers: [any(), any()]
这发生在 every {} return Unit
行上,其中有一个 对象文件称为 WakeUpTimeManager, 调用 .set(param1, param2) 函数和 在该函数中有一些内联函数 我认为它可能导致问题,但我不知道。我尝试在互联网上搜索但找不到解决方案。
下面是抛出错误的测试:
@Before
fun setup() {
mockkObject(WakeUpTimerManager)
every { WakeUpTimerManager.set(any(), any()) } returns Unit
}
这是在 every
行
上调用的函数
fun set(context: Context, timer: Timer) {
if (timer.atMillis < System.currentTimeMillis()) {
return
}
if (Preset.findByID(context, timer.presetID) == null) {
return
}
//This is an inline function
withGson {
PreferenceManager.getDefaultSharedPreferences(context).edit {
putString(PREF_WAKE_UP_TIMER, it.toJson(timer))
}
}
//This is an inline function
withAlarmManager(context) {
it.setAlarmClock(
AlarmManager.AlarmClockInfo(timer.atMillis, getPendingIntentForActivity(context)),
getPendingIntentForService(context, timer)
)
}
}
问题:为什么mockk会抛出这个错误?这是怎么回事?有解决办法吗?
试试 mockkStatic(WakeUpTimerManager::class)
。对我来说 mockkObject
也不起作用,但是 mockkStatic
起作用了
在我的例子中,我对 any()
使用了类型转换。我想测试方法 viewModel.show(Message())
是否已被调用。但是这个方法重载了(具有不同类型的签名),所以我尝试将参数 any()
转换为 Message
.
// show is overloaded method
fun show(resourceId: Int) {}
fun show(text: String) {}
fun show(message: Message) {}
// But it threw the exception.
verify { viewModel.show(any() as Message) }
// This won't work because Message() object will be different
verify { viewModel.show(Message()) }
也许嘲笑 message
会有所帮助,但对我来说不是。
// val message = mockk<Message>()
// every { Message() } returns message
// verify { viewModel.show(message) }
我必须添加 ,因为我使用了扩展方法。例如,fun ViewExtension.show()
:
mockkStatic(ViewExtension::class.java.name + "Kt") // Like "com.example...ViewExtensionKt"
然后模拟一个 :
every { viewModel.show(Message()) } just Runs
verify { viewModel.show(any() as Message) }
我想实施一些 UI 测试以确保今天实施的代码明天适用,但是当试图查看过去实施的 UI 测试是否有效时,它会抛出此错误:
Caused by: io.mockk.MockKException: Failed matching mocking signature for left matchers: [any(), any()]
这发生在 every {} return Unit
行上,其中有一个 对象文件称为 WakeUpTimeManager, 调用 .set(param1, param2) 函数和 在该函数中有一些内联函数 我认为它可能导致问题,但我不知道。我尝试在互联网上搜索但找不到解决方案。
下面是抛出错误的测试:
@Before
fun setup() {
mockkObject(WakeUpTimerManager)
every { WakeUpTimerManager.set(any(), any()) } returns Unit
}
这是在 every
行
fun set(context: Context, timer: Timer) {
if (timer.atMillis < System.currentTimeMillis()) {
return
}
if (Preset.findByID(context, timer.presetID) == null) {
return
}
//This is an inline function
withGson {
PreferenceManager.getDefaultSharedPreferences(context).edit {
putString(PREF_WAKE_UP_TIMER, it.toJson(timer))
}
}
//This is an inline function
withAlarmManager(context) {
it.setAlarmClock(
AlarmManager.AlarmClockInfo(timer.atMillis, getPendingIntentForActivity(context)),
getPendingIntentForService(context, timer)
)
}
}
问题:为什么mockk会抛出这个错误?这是怎么回事?有解决办法吗?
试试 mockkStatic(WakeUpTimerManager::class)
。对我来说 mockkObject
也不起作用,但是 mockkStatic
起作用了
在我的例子中,我对 any()
使用了类型转换。我想测试方法 viewModel.show(Message())
是否已被调用。但是这个方法重载了(具有不同类型的签名),所以我尝试将参数 any()
转换为 Message
.
// show is overloaded method
fun show(resourceId: Int) {}
fun show(text: String) {}
fun show(message: Message) {}
// But it threw the exception.
verify { viewModel.show(any() as Message) }
// This won't work because Message() object will be different
verify { viewModel.show(Message()) }
也许嘲笑 message
会有所帮助,但对我来说不是。
// val message = mockk<Message>()
// every { Message() } returns message
// verify { viewModel.show(message) }
我必须添加 fun ViewExtension.show()
:
mockkStatic(ViewExtension::class.java.name + "Kt") // Like "com.example...ViewExtensionKt"
然后模拟一个
every { viewModel.show(Message()) } just Runs
verify { viewModel.show(any() as Message) }