kotlin - 添加koin测试依赖的Gradle问题

标签 kotlin gradle junit5 gradle-kotlin-dsl koin

我是 gradle 的初学者,想使用 koin在我的 Kotlin 项目中。

但是,我得到以下错误

Execution failed for task ':compileTestKotlin'.
> Error while evaluating property 'filteredArgumentsMap' of task ':compileTestKotlin'
   > Could not resolve all files for configuration ':testCompileClasspath'.
      > Could not resolve org.jetbrains.kotlin:kotlin-test-junit5:1.6.20.
        Required by:
            project : > org.jetbrains.kotlin:kotlin-test:1.6.20
         > Module 'org.jetbrains.kotlin:kotlin-test-junit5' has been rejected:
              Cannot select module with conflict on capability 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.6.20' also provided by [org.jetbrains.kotlin:kotlin-test-junit:1.6.10(junitApi)]
      > Could not resolve org.jetbrains.kotlin:kotlin-test-junit:1.6.10.
        Required by:
            project : > io.insert-koin:koin-test:3.2.0-beta-1 > io.insert-koin:koin-test-jvm:3.2.0-beta-1
         > Module 'org.jetbrains.kotlin:kotlin-test-junit' has been rejected:
              Cannot select module with conflict on capability 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.6.10' also provided by [org.jetbrains.kotlin:kotlin-test-junit5:1.6.20(junit5Api)]```

这是我的gradle.build.kts 文件

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

val koinVersion = "3.2.0-beta-1"

plugins {
    kotlin("jvm") version "1.6.20"
    kotlin("plugin.serialization") version "1.6.10"
    application
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2")
    implementation("io.insert-koin:koin-core:$koinVersion")
    testImplementation("io.insert-koin:koin-test:$koinVersion")
    testImplementation("io.insert-koin:koin-test-junit5:$koinVersion")
    testImplementation("com.willowtreeapps.assertk:assertk-jvm:0.25")
    testImplementation(kotlin("test"))
}

tasks.test {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

application {
    mainClass.set("MainKt")
}

最佳答案

看起来有3个问题

正如我在评论中提到的,Kotlin JVM 和序列化插件的版本不匹配。这些应该始终相同!

plugins {
  kotlin("jvm") version "1.6.21"
  kotlin("plugin.serialization") version "1.6.21"
  application
}

但是,正如您发现的那样,它仍然不起作用。有一个更大的错误消息,包含三个错误。

  1. 无法解析 io.insert-koin:koin-test-junit5:3.2.0-beta-1
  2. 无法解析 org.jetbrains.kotlin:kotlin-test-junit5:1.6.21
  3. 无法解析 org.jetbrains.kotlin:kotlin-test-junit:1.6.10

让我们一个一个地过一遍

Java 11 库,Java 8 项目

这是 Gradle 给出的第一次失败的原因:

Could not resolve io.insert-koin:koin-test-junit5:3.2.0-beta-1.

No matching variant of io.insert-koin:koin-test-junit5:3.2.0-beta-1 was found. The consumer was configured to find an API of a library compatible with Java 8, preferably in the form of class files, preferably optimized for standard JVMs, and its dependencies declared externally, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'jvm' but

  • Incompatible because this component declares a component compatible with Java 11 and the consumer needed a component compatible with Java 8

koin-test-junit5 组件仅与 Java 11 兼容,但您的项目需要 Java 8 (kotlinOptions.jvmTarget = "1.8")。

让我们先解决这个问题,using Gradle Toolchain

tasks.withType<KotlinCompile>().configureEach {
  kotlinOptions.jvmTarget = "11"
}

kotlin {
  jvmToolchain {
    (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(11))
  }
}

这解决了 Java 版本不匹配的问题,并留下了另外两个错误。

功能冲突 - 不兼容的库

Cannot select module with conflict on capability

Cannot select module with conflict on capability 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.6.10' also provided by [org.jetbrains.kotlin:kotlin-test-junit:1.6.10(junitApi)]

Cannot select module with conflict on capability 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.6.10' also provided by [org.jetbrains.kotlin:kotlin-test-junit5:1.6.10(junit5Api)]

理解这一点需要对 Gradle 如何选择版本有相当多的了解。

tl;dr:org.jetbrains.kotlin:kotlin-test-junitorg.jetbrains.kotlin:kotlin-test-junit5 不兼容。您只能使用一个或另一个 - 不能同时使用

我真的不明白 Koin 需要什么才能发挥最佳作用。看起来它对 JUnit5 有硬依赖性,因此您必须使用这些依赖性,并且无法使用 kotlin("test")

dependencies {
  implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2")
  implementation("io.insert-koin:koin-core:$koinVersion")
  testImplementation("io.insert-koin:koin-test:$koinVersion")
  testImplementation("io.insert-koin:koin-test-junit5:$koinVersion")
  testImplementation("com.willowtreeapps.assertk:assertk:0.25")
  testImplementation("org.junit.jupiter:junit-jupiter:5.8.2")


// incompatible with JUnit 5, which I think is required by Koin?
// testImplementation(kotlin("test")) 
}

说明

简而言之,当你使用Gradle构建库时,你可以声明'attributes' .它们是自由形式的字符串,所以它们真的可以是任何东西。他们描述了诸如“这个库需要 Java 11”或“这是测试覆盖率数据”之类的内容。

一些属性对于 Gradle 解决项目的依赖关系很重要。您最初得到的错误是由这样一个属性引起的:'capability' .它描述了库生成的 Maven 坐标。

在 Maven 坐标的情况下,如果它们发生冲突,那么 Gradle 不知道该怎么做,并抛出错误。由用户来修复它。 There's a lot of Gradle docs about conflict resolution ,但通常最简单的答案是删除所有冲突的依赖项。

capabilities 的有趣之处在于,因为它只是一个字符串,所以您可以向其中添加任何内容。 org.jetbrains.kotlin:kotlin-test-junit5org.jetbrains.kotlin:kotlin-test-junit 的作者已经完成了 两者具有相同的能力

org.jetbrains.kotlin:kotlin-test-framework-impl:1.6.10

如果你search for this library你会发现它不存在。那是因为能力完全是人为的!作者已经弥补了,特别是 Gradle 会抛出一个错误,由用户来修复它。

这就是解决方法:选择 kotlin-test-junitkotlin-test-junit5,因为您不能同时拥有两者。

关于kotlin - 添加koin测试依赖的Gradle问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72150544/

相关文章:

android-studio - 如何在 RecyclerView 上使用 LiveData?

kotlin - 如何在kotlin中进行多条件for循环

java - JUnit 出现初始化错误( eclipse 氧气)

maven - 如何配置 Maven 插件来运行 spock 和 junit5 测试

android - 如何使用双向数据绑定(bind)更新 RecyclerView 中所有 EditTexts 元素的文本

android - 每当我在 git 中提交时,如何清除 $HOME/.gradle/caches/?

android - Android Studio-Gradle Sync Project失败-找不到目标哈希字符串

Android 支持库构建 v26.X.X 构建错误 : Attribute "font" already defined

java - JUnit 5 - JDBC 语句测试

安卓和 Kotlin : Unresolved reference: home