gradle 如何在使用java-test-fixtures模块时从测试中测试声明为“internal”的Kotlin函数

fdbelqdn  于 2023-10-19  发布在  Java
关注(0)|答案(1)|浏览(106)

我尝试在我的项目中使用测试夹具在Kotlin。不幸的是,我遇到了一个奇怪的问题,可能是一个bug,在工具链的一个组件中(不确定是哪一个)。
通常情况下,main中声明为internal的Kotlin函数可以从同一个包的单元test访问。有许多证据支持这一说法,特别是Kotlin: Make an internal function visible for unit tests
如果我们有src/main/kotlin/ main.kt

@file:JvmName("Main")
package org.example.broken_test_fixtures

internal fun sayHello(who: String): String = "Hello, $who!"

fun main() {
    println(sayHello("world"))
}

src/test/kotlin/SayHelloTest.kt

package org.example.broken_test_fixtures

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test

class SayHelloTest {
    @Test
    fun testSayHello() {
        val expected = "Hello, world!"
        val actual = sayHello("world")
        assertEquals(actual, expected)
    }
}

使用常规build.gradle.kts成功通过测试:

plugins {
    kotlin("jvm") version "1.3.61"
}

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

repositories {
    mavenCentral()
}

dependencies {
    implementation(kotlin("stdlib-jdk8"))
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.5.2")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.5.2")
}

tasks {
    compileKotlin {
        kotlinOptions.jvmTarget = "1.8"
    }
    compileTestKotlin {
        kotlinOptions.jvmTarget = "1.8"
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}

到目前为止还不错。
但是使用an addition的一行插入插件列表:

id("java-test-fixtures")

测试的构建被破坏,并出现以下错误:

e: /home/work/users/alex/broken-test-fixtures/src/test/kotlin/SayHelloTest.kt: (10, 22): Cannot access 'sayHello': it is internal in 'org.example.broken_test_fixtures'

我发现类似的问题在GradleKotlin Gradle plugin bug跟踪器中也提到过。不幸的是,我无法从这些问题中找到解决方案。也许,这是一个不同的问题。
为了方便读者,我准备了一个小repo on Github来演示这个问题。

cigdeys3

cigdeys31#

从Kotlin1.3.60开始,https://youtrack.jetbrains.com/issue/KT-20760中实现了associateWith GradleKotlin插件API
从1.9.20开始,它也将默认为测试夹具启用,如https://youtrack.jetbrains.com/issue/KT-34901中所述
现在<1.9.20,这个项目有各种各样的引用:https://github.com/TWiStErRob/repros/tree/main/kotlin/test-fixtures-and-suites-friends
在IDEA中可能会显示错误,但在命令行中可以正常工作。每一行的错误修复都在build.gradle.kts中注解,选择你需要的一个:)

相关问题