Мультиплатформа Kotlin: библиотека kotlinx.coroutines.test не отображается в модуле commonTest - PullRequest
1 голос
/ 28 июня 2019

У меня трудности с интеграцией среды тестирования kotlin для сопрограмм kotlinx.coroutines.test с мультиплатформенным проектом, ориентированным на Android (и ios в будущем)

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

build.gradle для общего модуля:

plugins {
    id 'org.jetbrains.kotlin.multiplatform'
    id 'com.android.library'
    id 'kotlin-kapt'
}

android {
    defaultConfig {
        compileSdkVersion 28
        javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true
    }
    lintOptions {
        checkAllWarnings true
    }
}

def coroutinesVersion = "1.3.0-M2"
def mockKVersion = "1.9.3"

kotlin {
    targets {
        fromPreset(presets.android, 'android')
    }

    sourceSets {
        commonMain.dependencies {
            //Kotlin
            implementation "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version"
            implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" //used in Log implementation
            implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutinesVersion"
        }
        commonTest.dependencies {
            //Kotlin
            implementation "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version"
            implementation "org.jetbrains.kotlin:kotlin-test-annotations-common:$kotlin_version"
            //Coroutines testing
            implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutinesVersion"
            implementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion"
            implementation "io.mockk:mockk-common:$mockKVersion"
        }
        androidMain.dependencies {
            implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
            implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
        }
        androidTest.dependencies {
            implementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
            implementation "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
            implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
            implementation "io.mockk:mockk:$mockKVersion"
        }
    }
}

/*
* Due to the current limitations, it requires that the Android target is created before the kapt dependencies are configured,
* which needs to be done in a top-level dependencies { ... } block rather than within Kotlin source sets dependencies.
*/
dependencies {
    implementation 'javax.annotation:javax.annotation-api:1.3.2'
    kapt 'com.google.auto.factory:auto-factory:1.0-beta6@jar'
    compileOnly "com.google.auto.factory:auto-factory:1.0-beta6"
}

Пример теста в commonTest наборе источника:

package some.package.common.test

import kotlin.test.Test
import kotlin.test.assertTrue

class SomeTest {

    @Test
    fun `should pass`() {
        //none of the kotlinx.coroutines.test content is available here (eg. runBlockingTest)
        assertTrue { 2 + 2 == 4 }
    }
}

1 Ответ

1 голос
/ 02 июля 2019

Оказывается, kotlinx.coroutines.test - это библиотека JVM, поэтому ее нельзя использовать в общем модуле.

Возможные решения:

  • Пишем тесты и используем библиотекув Android (или другом совместимом с JVM) модуле
  • Определите свою собственную общую функцию, которая будет использовать JVM / собственную реализацию runBlocking (см. https://youtrack.jetbrains.com/issue/KT-22228)

//TestUtil.kt in commonTest source set
expect fun runBlocking(block: suspend () -> Unit)

//TestUtil.kt in androidTest source set
actual fun runBlocking(block: suspend () -> Unit) = kotlinx.coroutines.runBlocking { block() }

//example usage in commonTest source set
class Test {
    @Test
    fun shouldPass() = runBlocking {
        assertTrue { 2 + 2 == 4 }
    }
}
...