В Android как вы проверяете функцию расширения Kotlin Handler.postDelayed (delayInMillis: Long, токен: Any ?, action: () -> Unit) с Mockito? - PullRequest
0 голосов
/ 16 января 2020

В моем 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, имеют разные области памяти).

Может кто-нибудь сказать мне, как я могу проверить это? Или это плохой тест, потому что я тестирую часть реализации метода?

...