【问题标题】:Could not resolve io.kotest:kotest-runner-junit5-jvm:4.1.1 in kotlin multiplatform module无法在 kotlin 多平台模块中解析 io.kotest:kotest-runner-junit5-jvm:4.1.1
【发布时间】:2020-07-04 17:28:31
【问题描述】:

我有一个包含多个模块的项目。其中一个模块是 kotlin 多平台。我正在尝试使用 Kotest 4.1.1 为其添加单元测试。此版本发布在存储库 mavenCentral() 中,我可以在使用 java 库插件的模块中很好地使用此版本。但是在多平台模块中使用 Kotest 4.1.1 时每次尝试同步都会失败:

Could not resolve io.kotest:kotest-runner-junit5-jvm:4.1.1.

我不明白为什么会这样。这个错误肯定是特定于使用 kotlin 多平台插件的模块,因为使用常规 kotlin jvm 插件的同一项目中的不同模块和相同版本的 kotest 可以很好地同步。所以 gradle 绝对有能力在定义的存储库中找到版本并使用 kotest 4.1.1。

结果(不足为奇),kotest 的东西不在 multiplatform 模块中 commonTest 的测试类路径中,因此单元测试类无法导入 io.kotest.xxx 包。

我希望在 JVM 运行单元测试(使用 junit5)中使用 kotest 来测试多平台代码。但这是我第一次尝试做多平台,所以一切都是可疑的:-)

下面的 sn-p 是来自多平台模块的 build.gradle.kts 的 sourceSets 代码。如果注释部分保持原样,gradle 同步很好,但 commonTest 中的源当然看不到 kotest。如果移除了 cmets,则会出现错误

sourceSets {
    commonMain {
        dependencies {
            implementation(kotlin("stdlib-common"))
        }
    }
    /*
    commonTest {
        dependencies {
            implementation(Kotest.framework) 
        }
    }
     */
}

这是两个模块中使用的 Kotest.framework val 的值:

object Kotest {
    const val version = "4.1.1"
    const val framework = "io.kotest:kotest-runner-junit5-jvm:$version"
    const val assertions = "io.kotest:kotest-assertions-core-jvm:$version"
    const val propertyTest = "io.kotest:kotest-property-jvm:$version"
}

在 Android Studio 中使用 kotlin 多平台插件时,有没有人让 kotest 4.1.1 工作?任何关于如何进一步诊断的想法将不胜感激。提前谢谢...

配置: 安卓工作室 4.0 摇篮 6.5.1 Kotlin 1.3.72

【问题讨论】:

  • 您是否尝试使用 commonTest 块中的依赖项?如果是这样,那就行不通了。您需要将依赖项添加到 jvmTest 配置中,并在那里编写测试。
  • @sksamuel 你有一些示例设置吗?我有同样的问题。
  • 您是否尝试过使用io.kotest:kotest-runner-junit5 依赖而不是io.kotest:kotest-runner-junit5-jvm

标签: kotlin gradle-kotlin-dsl multiplatform kotest


【解决方案1】:

相关配置的问题在于,仅 JVM 的工件 (io.kotest:kotest-runner-junit5-jvm) 在多平台 commonTest 部分中显示为依赖项。这是行不通的,因为公共部分不仅涵盖 JVM 目标,还涵盖其他(JS、Native)(请参阅the multiplatform doc)。

所以 Junit5 运行器应该只进入 JVM 后端部分。公共部分可以包括用于所有目标的工件。请参阅 Kotest 的 Quick Start 文档(在每个部分中选择最右侧的选项卡(“多平台”)。

这些是当前使用 kotest 4.4.1 的 build.gradle.kts 脚本中的相关部分:

val kotestVersion = "4.4.1"

kotlin {
    jvm("backend") {
        compilations.all {
            kotlinOptions.useIR = true
        }
        withJava()
    }
    js("frontend", LEGACY) {
        browser {
            binaries.executable()
            testTask {
                useKarma {
                    useChromeHeadless()
                    webpackConfig.cssSupport.enabled = true
                }
            }
        }
    }
    sourceSets {
        val commonTest by getting {
            dependencies {
                implementation("io.kotest:kotest-framework-engine:$kotestVersion")
                implementation("io.kotest:kotest-assertions-core:$kotestVersion")
                implementation("io.kotest:kotest-property:$kotestVersion")
            }
        }
        val backendTest by getting {
            dependencies {
                implementation("io.kotest:kotest-runner-junit5:$kotestVersion")
            }
        }
    }
}

tasks {
    // Tests
    withType<Test> {
        useJUnitPlatform()
    }
}

注意:上面的示例使用backendfrontend 名称作为JVM 和JS 目标。如果您坚持使用默认名称,backendTest 源集将被称为 jvmTest

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 2021-12-27
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多