KotlinJS тесты, не включая общие классы - PullRequest
0 голосов
/ 03 октября 2019

У меня есть мультиплатформенный проект kotlin, который компилируется в JS и JVM со следующей конфигурацией сборки:

common - build.gradle

plugins {
    id 'kotlin-platform-common' version '1.3.10'
}

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-common:1.3.10"
    compile 'org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.0.1'

    testCompile "org.jetbrains.kotlin:kotlin-test-annotations-common"
    testCompile "org.jetbrains.kotlin:kotlin-test-common"
}

js - build.gradle

plugins {
    id 'kotlin-platform-js' version '1.3.10'
}

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    expectedBy project(":Lib-common")

    compile "org.jetbrains.kotlin:kotlin-stdlib-js:1.3.10"
    compile 'org.jetbrains.kotlinx:kotlinx-coroutines-core-js:1.0.1'

    testCompile "org.jetbrains.kotlin:kotlin-test"
    testCompile "org.jetbrains.kotlin:kotlin-test-js"
}

compileKotlin2Js {
    kotlinOptions.outputFile = "${projectDir}/output/lib."
    kotlinOptions.moduleKind = "commonjs"
    kotlinOptions.metaInfo = false
}

compileTestKotlin2Js {
    kotlinOptions.outputFile = "${projectDir}/output/lib_test.js"
    kotlinOptions.moduleKind = "commonjs"
    kotlinOptions.metaInfo = false
}

jvm - build.gradle

plugins {
    id 'kotlin-platform-jvm' version '1.3.10'
}

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    expectedBy project(":Lib-common")

    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.10"
    compile 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.1'

    compile 'org.apache.httpcomponents:httpcore:4.4.11'
    compile 'org.apache.httpcomponents:httpclient:4.5.7'
    compile 'org.apache.httpcomponents:httpmime:4.5.7'

    testCompile "junit:junit:4.12"
    testCompile "org.jetbrains.kotlin:kotlin-test"
    testCompile "org.jetbrains.kotlin:kotlin-test-junit"
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

sourceCompatibility = "1.8"

У меня есть тест в общем модуле, который работает, как и ожидалось, на JVM. Модуль JS успешно компилирует и генерирует файл js с помощью задачи compileKotlin2Js, однако, когда я запускаю compileTestKotlin2Js, тестовый класс в общем модуле не может найти класс, который он тестирует. Это ошибка при попытке запустить compileTestKotlin2Js:

> Task :Lib-js:classes
e: <location>\Lib\Lib-common\src\test\kotlin\mypackage\ClientTest.kt: (3, 45): Unresolved reference: Client


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':Lib-js:compileTestKotlin2Js'.
> Compilation error. See log for more details

1 Ответ

1 голос
/ 03 октября 2019

kotlin-platform-js плагин gradle не создает задач для запуска тестов, он только компилирует код Kotlin в основных и исходных наборах тестов, поэтому вам нужно самостоятельно настроить всю инфраструктуру тестирования для JS.

Я рекомендую переключитьсяк новому подходу к созданию мультиплатформенного проекта, когда весь код находится в одном модуле, к которому применен плагин kotlin-mutliplatform. Этот плагин может иметь готовые тестовые задачи JS.

Файл build.gradle такого проекта выглядит следующим образом:

plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '1.3.50'
}
repositories {
    mavenCentral()
}
group 'com.example'
version '0.0.1'

kotlin {
    jvm()
    js {
        nodejs { // target and run tests on node.js
        }
    }

    sourceSets {
        commonMain {
            dependencies {
                implementation kotlin('stdlib-common')
            }
        }
        commonTest {
            dependencies {
                implementation kotlin('test-common')
                implementation kotlin('test-annotations-common')
            }
        }
        jvmMain {
            dependencies {
                implementation kotlin('stdlib-jdk8')
            }
        }
        jvmTest {
            dependencies {
                implementation kotlin('test')
                implementation kotlin('test-junit')
            }
        }
        jsMain {
            dependencies {
                implementation kotlin('stdlib-js')
            }
        }
        jsTest {
            dependencies {
                implementation kotlin('test-js')
            }
        }
    }
}

Подробнее о разработке мультиплатформенных проектов вы можете прочитать подробнее. здесь: https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#building-multiplatform-projects-with-gradle

...