Я пытаюсь протестировать моего докладчика, который вызывает приостановленную функцию из уровня хранилища, следующим образом:
override fun viewCreated() {
launch {
val hasPermission = permissionChecker.execute() //suspended function
if (hasPermission) {
foo()
} else {
view.bar()
}
}
Ведущий также расширяет этот интерфейс:
interface CoroutinePresenter: CoroutineScope {
val job: Job
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
fun stopAllActiveJobs() {
coroutineContext.cancelChildren()
}
И приостановленная функция определяется следующим образом:
suspend fun execute() : Boolean = withContext(Dispatchers.IO) {
return@withContext class.foo()
}
В приложении все работает как положено, но когда я попытался написать какой-то модульный тест, я заметил, что всякий раз, когда я вызываю кусок кода внутри launch , поток переключается, но тест не ждет выполнение. Это реализация теста:
@Test
fun `Test of Suspended Function`() = runBlocking {
presenter.viewCreated()
then(view).should().bar()
...
}
Я также добавил предлагаемую библиотеку для тестирования kotlinx-coroutines-test
, но результат с ней тот же. Я также пытался следовать предложению , а также реализовывать что-то вроде this , но все же не повезло.
Я думаю, что проблема заключается в фактическом создании другого потока всякий раз, когда в докладчике вызывается launch , и тест на самом деле не знает, как его ждать. Я также попытался вернуть Job и вызвать job.join()
, но он не работает с NullPointerException
.
Надеюсь, вы, ребята, можете мне помочь.