我有一个包含多个模块的项目。其中一个模块是kotlin多平台。我正在尝试使用Kotest 4.1.1为它添加单元测试。此版本发布在存储库mavenCentral()中,我可以在使用Java库插件的模块中很好地使用此版本。但是在多平台模块中使用Kotest 4.1.1时,每次尝试同步都会失败:
Could not resolve io.kotest:kotest-runner-junit5-jvm:4.1.1.
我不明白为什么会这样。此错误绝对是特定于使用kotlin multiplatform插件的模块的,因为在同一项目中使用常规kotlin jvm插件的相同模块和相同版本的kotest可以很好地同步。因此gradle绝对有能力在定义的存储库中找到发布并使用kotest 4.1.1。
结果(毫不奇怪),kotest东西不在多平台模块中commonTest的测试类路径上,因此单元测试类无法导入io.kotest.xxx包。
我希望在JVM运行的单元测试(使用junit5)中使用kotest来测试多平台代码。但这是我第一次尝试做多平台,所以一切都令人怀疑:-)
下面的代码片段是来自多平台模块的build.gradle.kts的sourceSets代码。如果注释的部分保持原样,则gradle可以正常同步,但commonTest中的源当然看不到kotest。如果删除评论,则会发生错误
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吗?任何有关如何进一步诊断的想法将不胜感激。预先感谢...
配置: Android Studio 4.0 摇篮6.5.1 Kotlin 1.3.72
答案 0 :(得分:1)
相关配置的问题是仅 JVM 的工件 (io.kotest:kotest-runner-junit5-jvm
) 在多平台 commonTest
部分中显示为依赖项。这不起作用,因为公共部分不仅涵盖 JVM 目标,还涵盖其他(JS、Native)(请参阅 the multiplatform doc)。
因此 Junit5 运行程序应该只进入 JVM 后端部分。公共部分可以包括用于所有目标的工件。请参阅 Kotest 的 Quick Start 文档(在每个部分中选择最右侧的选项卡(“Multiplatform”))。
这些是当前使用 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()
}
}
注意:上面的示例对 JVM 和 JS 目标使用 backend
和 frontend
名称。如果您坚持使用默认名称,则 backendTest
源集将被称为 jvmTest
。