首页 > 解决方案 > 使用 java-test-fixtures 模块时如何从测试中测试声明为“内部”的 kotlin 函数

问题描述

我尝试在我的 kotlin 项目中使用测试装置。不幸的是,我在工具链的一个组件中遇到了一个奇怪的问题,可能是一个错误(不确定是哪个)。

main通常,声明中的 Kotlin 函数internal可以test从同一包中的单元访问。有许多证据支持这种说法,尤其是Kotlin:使内部函数对单元测试可见

事实上,如果我们有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()
}

到目前为止,一切都很好。

但是在插件列表中添加了一行:

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'

我发现 Gradle 中提到了类似的问题 Kotlin Gradle 插件错误跟踪器。不幸的是,我无法从这些问题中提取解决方案。也许,这是一个不同的问题。

为了方便读者,我在 Github 上准备了一个小仓库来演示这个问题。

标签: unit-testinggradlekotlinjava-test-fixtureskotlin-gradle-plugin

解决方案


推荐阅读