首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在kotlin多平台模块中解析io.kotest:kotest-runner-junit5-jvm:4.1.1

无法在kotlin多平台模块中解析io.kotest:kotest-runner-junit5-jvm:4.1.1
EN

Stack Overflow用户
提问于 2020-07-05 01:28:31
回答 1查看 814关注 0票数 1

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

代码语言:javascript
复制
Could not resolve io.kotest:kotest-runner-junit5-jvm:4.1.1.

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

因此(毫不奇怪),io.kotest.xxx内容不在多平台模块中commonTest的测试类路径中,因此单元测试类不能导入kotest包。

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

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

代码语言:javascript
复制
sourceSets {
    commonMain {
        dependencies {
            implementation(kotlin("stdlib-common"))
        }
    }
    /*
    commonTest {
        dependencies {
            implementation(Kotest.framework) 
        }
    }
     */
}

下面是在两个模块中使用的Kotest.framework val的值:

代码语言:javascript
复制
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吗?任何关于如何进一步诊断这一问题的想法都将不胜感激。先谢谢你...

配置: Android studio 4.0 Gradle 6.5.1 Kotlin 1.3.72

EN

回答 1

Stack Overflow用户

发布于 2021-02-27 06:27:07

所讨论的配置的问题是,仅限JVM的工件(io.kotest:kotest-runner-junit5-jvm)在多平台commonTest部分中显示为依赖项。这是行不通的,因为公共部分不仅涵盖了JVM目标,而且还涵盖了其他(JS,本机)(参见the multiplatform doc)。

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

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

代码语言:javascript
复制
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()
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62732289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档