Тестирование сопрограммы завершается ошибкой: «Это задание еще не завершено» - PullRequest
1 голос
/ 12 июля 2020

Я слежу за сообщением в блоге Крейга Рассела о тестировании сопрограмм: https://craigrussell.io/2019/11/unit-testing-coroutine-suspend-functions-using-testcoroutinedispatcher/ но я не могу пройти этот тест:

@Test
fun multipleLaunch() = runBlockingTest {
    var result = 0
    val jobs = mutableListOf<Job>()
    for (j in 0 until 10) {
        val job = launch(testDispatcherProvider.io()) {
            delay(1000)
            result++
        }
        jobs.add(job)
    }
    jobs.forEach { job ->
        job.join()
    }
    assertEquals(10, result)
}

В основном я запускаю куча параллельных заданий и хотите получить результат, когда все они будут выполнены. Я получаю это уже классическое исключение:

java .lang.IllegalStateException: это задание еще не завершено

Пожалуйста, посоветуйте, как это сделать работать по назначению.

Мой полный код:

class LaunchTest {
    @get:Rule
    var coroutinesTestRule = CoroutineTestRule()

    val testDispatcherProvider = object : DispatcherProvider {
        override fun io(): CoroutineDispatcher = coroutinesTestRule.testDispatcher
    }

    @Test
    fun multipleLaunch() = runBlockingTest {
        var result = 0
        val jobs = mutableListOf<Job>()
        for (j in 0 until 10) {
            val job = launch(testDispatcherProvider.io()) {
                delay(1000)
                result++
            }
            jobs.add(job)
        }
        jobs.forEach { job ->
            job.join()
        }
        assertEquals(10, result)
    }
}

class CoroutineTestRule constructor(val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()) : TestWatcher() {
    override fun starting(description: Description?) {
        super.starting(description)
        Dispatchers.setMain(testDispatcher)
    }

    override fun finished(description: Description?) {
        super.finished(description)
        Dispatchers.resetMain()
        testDispatcher.cleanupTestCoroutines()
    }
}

1 Ответ

0 голосов
/ 13 июля 2020

Решено.

Я полностью виню в этом Android автозаполнение Studio. :)

Я просто запустил неправильный "runBlockingTest ()".

Замените эту строку:

fun multipleLaunch() = runBlockingTest {

на эту:

fun multipleLaunch() = coroutinesTestRule.testDispatcher.runBlockingTest {
...