Функция Mocked Suspend возвращает ноль в Mockito - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть приостановленные функции, которые я смоделировал, используя Mockito, но он возвращает null

оба проекта используют

'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0'

Пример 1

вот мой тест, в котором макет возвращает ноль

@Test
fun `when gps not enabled observer is notified`() = runBlocking {
    // arrange
    `when`(suspendingLocationService.getCurrentLocation()).thenReturn(result) // <- when called this returns null

    // act
    presenter.onStartShopButtonClick()

    // assert
    verify(view).observer
    verify(observer).onPrepareShop()
}

У меня есть следующая реализация в моем презентере

  override suspend fun onStartShopButtonClick() {
    val result = suspendingLocationService.getCurrentLocation() // <- in my test result is null!!!!!!
    view?.apply {
        observer?.onPrepareShop()
        when {
            result.hasGivenPermission == false -> observer?.onStartShop(StoreData(), APIError(APIError.ErrorType.NO_PERMISSION))
            result.hasGPSEnabled == false -> observer?.onStartShop(StoreData(), APIError(APIError.ErrorType.GPS_NOT_ENABLED))
            result.latitude != null && result.longitude != null ->
                storeLocationService.getCurrentStore(result.latitude, result.longitude) { store, error ->
                    observer?.onStartShop(store, error)
                }
        }
    }
}

однако у меня есть то, во что я верю очень похожей реализации, работающей ниже

Пример 2

Приведенный ниже тест проходит, и правильная функция отвечает продуктом

@Test
fun `suspending implementation updates label`() = runBlocking {
    // arrange
    `when`(suspendingProductProvider.getProduct("testString")).thenReturn(product)

    // act
    presenter.textChanged("testString")

    // assert
    verify(view).update(product.name)
}

вот реализация презентатора

override suspend fun textChanged(newText: String?) {
    val product = suspendingNetworkProvider.getProduct(newText)
    view?.update(product.name)
}

вот интерфейс, который я издеваюсь

interface SuspendingProductProvider {
    suspend fun getProduct(search: String?): Product
}

что я не делаю в первом примере

1 Ответ

0 голосов
/ 01 ноября 2018

Mockito имеет специальную поддержку функций suspend, но в Kotlin 1.3 произошли некоторые изменения в том, как сопрограммы реализованы внутри, поэтому более старые версии Mockito больше не распознают suspend методы, скомпилированные Kotlin 1.3. И kotlinx.coroutines использует Kotlin 1.3 начиная с версии 1.0.0.

Соответствующая поддержка была добавлена ​​в Mockito, но только начиная с версии 2.23 , поэтому обновление вашей версии Mockito поможет.

...