Android: тест ViewModel с использованием сопрограмм kotlin не работает - PullRequest
0 голосов
/ 19 февраля 2019

Я впервые использую сопрограммы, и у меня возникают проблемы при тестировании моей работы на ViewModel.Тест не пройден с

Wanted but not invoked:
observer.onChanged(<Capturing argument>);

Тест выглядит следующим образом:

val androidVersioningMock: Versioning.AndroidVersioning = mock {
    on { required } doAnswer { "3.3.6" }
}
val versioningMock: Versioning = mock {
    on { android } doAnswer { androidVersioningMock }
}
whenever(networkManager.getAppVersionAsync()).thenReturn(GlobalScope.async { versioningMock })
runBlocking {
    updateVersionModel =
        UpdateViewModel(application, coroutineDispatcherProvider).apply {
            updateLiveData.observeForever(stateObserver)
        }
    verify(stateObserver).onChanged(stateCaptor.capture())
    assertTrue(stateCaptor.lastValue is UpdateState.NoUpdate)
    assertEquals(UpdateState.NoUpdate, stateCaptor.lastValue)
}

Я высмеял coroutineDispatcherProvider с

@ExperimentalCoroutinesApi
override val coroutineDispatcherProvider = mock<CoroutineDispatcherProvider> {
    on { main } doAnswer { TestCoroutineContext() }
    on { io } doAnswer { TestCoroutineContext() }
}

И в моей ViewModel,метод, который терпит неудачу -

private suspend fun getUpdateVersion(): Versioning =
    withContext(coroutineDispatcherProvider.io) {
        networkManager.getAppVersionAsync().await()
    }

, который выполняется как:

launch {
    val versioningModel = getUpdateVersion()
    ...
}

Я что-то не издеваюсь или не делаю что-то?Заранее спасибо!

1 Ответ

0 голосов
/ 19 февраля 2019

Диспетчер TestCoroutineContext полезен для обработки синхронизации в тестах, но вы хотите выполнять асинхронные вызовы синхронно.Вы должны быть в состоянии достичь этого с помощью диспетчера Unconfined.

...