Как протестировать функцию kotlin, объявленную "внутренней" из тестов, когда используется модуль java-test-fixtures

Я пробовал использовать тестовые инструменты в моем проекте на котлине. К сожалению, я столкнулся со странной проблемой, возможно, с ошибкой в ​​компоненте инструментальной цепочки (не уверен, какой именно).

Обычно функция Котлина в main объявлен 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, демонстрирующее проблему.

1 ответ

Начиная с Kotlin 1.3.60 естьassociateWithAPI плагина Gradle Kotlin реализован в https://youtrack.jetbrains.com/issue/KT-20760 .

С версии 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, выберите тот, который вам нужен :)

Другие вопросы по тегам