Как сделать Kotlin `внутренние` объекты доступными для тестов? - PullRequest
2 голосов
/ 22 февраля 2020

Мой проект использует несколько исходных наборов Gradle для своей базы производственного кода вместо просто main:

  • domain
  • dal
  • rest
  • test
  • dbUnitTest

Это оказалось очень полезным для ограничения зависимостей и обеспечения разделения интересов.

Это однако имеет один недостаток: мы не можем получить доступ к классам или методам с visibility internal из тестовых классов. Причина этого заключается в том, что Kotlin компилятор помещает каждый исходный набор в свой собственный "модуль":

$ find . -name '*.kotlin_module'
./classes/kotlin/domain/META-INF/contact-management_domain.kotlin_module
./classes/kotlin/dal/META-INF/contact-management_dal.kotlin_module
./classes/kotlin/rest/META-INF/contact-management_dal.kotlin_module
./classes/kotlin/test/META-INF/contact-management.kotlin_module
./classes/kotlin/dbUnitTest/META-INF/contact-management_dbUnitTest.kotlin_module

Я бы хотел, чтобы все исходные наборы использовали то же имя модуля "contact-management", что и по умолчанию основной набор будет.

Я попытался переопределить имя с помощью опции компилятора -module-name:

tasks.withType<KotlinCompile> {
    kotlinOptions {
        // place all source sets in the same kotlin module, making objects with 'internal' visibility available to every source sets of this project
        freeCompilerArgs += listOf("-module-name \"contact-management\")
    }
}

После запуска gradlew build я получаю

> Task :contact-management:compileDomainKotlin FAILED
e: Invalid argument: -module-name "contact-management"

Причина в том, что -module-name "contact-management_domain" устанавливается ранее кодом Gradle, вызывающим также компилятор Kotlin, но, очевидно, эта опция принимается только один раз.

In сборка Gradle, как я могу контролировать то, что компилятором Kotlin считается *1045* "одним модулем"?

A связанный вопрос где test исходный набор, подлежащий разделению, пока не дал удовлетворительных ответов.

...