В моем Android проекте у меня есть метод в Kotlin
, который должен опубликовать delayed action to a Handler
. Мой метод выглядит примерно так (упрощенно):
fun sendPostDelayedAction(doWhenFired: () -> Unit) {
handler.postDelayed(myDelayInMs) {
doWhenFired()
}
}
Поэтому я использую следующую функцию расширения из Handler.kt
inline fun Handler.postDelayed(
delayInMillis: Long,
token: Any? = null,
crossinline action: () -> Unit
): Runnable {
val runnable = Runnable { action() }
if (token == null) {
postDelayed(runnable, delayInMillis)
} else {
HandlerCompat.postDelayed(this, runnable, token, delayInMillis)
}
return runnable
}
В модульном тесте как проверить метод postDelayed был правильно вызван в этой функции? Когда я запускаю тест ниже, я получаю:
Comparison Failure: Argument(s) are different! -> at android.os.Handler.postDelayed(Handler.java)
@Test
fun `test set handler`(){
val handler: Handler = mock()
val doWhenFired: () -> Unit = mock()
val myObject = MyObject(handler)
object.sendPostDelayedAction(doWhenFired)
//verify if the handler has set the correct trigger
verify(handler).postDelayed(any(), anyOrNull(), eq(doWhenFired))
}
Кажется, что макет не использует функцию расширения Kotlin для проверки.
Я также пытался обернуть действие функция в Runnable для соответствия методу Handler. java postDelayed, но затем аргументы также не совпадают (я предполагаю, что и runnable, созданный мной в тесте, и runnable, созданный в Handler.kt, имеют разные области памяти).
Может кто-нибудь сказать мне, как я могу проверить это? Или это плохой тест, потому что я тестирую часть реализации метода?