6 votes

Kotlin multiplateforme : la bibliothèque kotlinx.coroutines.test n'est pas visible dans le module commonTest

J'ai des difficultés à intégrer le cadre de test de Kotlin pour les coroutines. kotlinx.coroutines.test avec un projet multiplateforme qui cible Android (et ios dans le futur)

Mon code commun s'appuie fortement sur les coroutines mais je ne parviens pas à les tester (il semble que la bibliothèque de test ne soit pas dans le classpath).

build.gradle pour le module commun :

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"
}

Exemple de test en commonTest l'ensemble des sources :

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 }
    }
}

9voto

Marcin Points 258

Il s'avère que kotlinx.coroutines.test est une bibliothèque de la JVM, elle ne peut donc pas être utilisée dans un module commun.

Solutions possibles :

  • Écrire des tests et utiliser la bibliothèque dans un module Android (ou autre compatible JVM)
  • Définissez votre propre fonction commune qui utilisera l'implémentation JVM/Native de runBlocking (cf. 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 }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X