Библиотека тестов Gradle в многомодульном проекте

#gradle

#gradle

Вопрос:

Я хочу создать библиотеку, от которой могут зависеть другие модули в моем проекте, но только для тестов. Я внимательно прочитал документацию Gradle и не смог найти, как это сделать. Это моя структура проекта:

 gradle-example:
  app:
    src/main/kotlin ...
    src/test/kotlin <- this is supposed to use 'com.example.SomeTestUtil'
  testlib:
    src/test/kotlin/com.example.SomeTestUtil
 

settings.gradle.kts:

 rootProject.name = "gradle-example"
include("app")
include("testlib")
 

В модуле приложения я попытался добавить

 dependencies {
  testImplementation(project(:testlib"))
}
 

Но я получаю ошибку компиляции при попытке импортировать SomeTestUtil app тестовые классы в модуле.

Каков правильный способ объявить зависимость от модуля в том же проекте, который позволяет использовать тестовые источники в тестовом коде?

Чтобы уточнить, мы хотим создать библиотеку, которая может использоваться только другими модулями в рамках src/test и не src/main .

Комментарии:

1. Если у вас есть код, специфичный для теста, где-либо ниже main , вы делаете это неправильно.

2. @MartinZeitler Я не уверен, что понимаю. Это именно та ситуация, которой я пытаюсь избежать, я хочу инкапсулировать тестовый код для тестирования исходных текстов только через общую тестовую библиотеку и никогда не позволять ему загрязнять какой-либо производственный код

Ответ №1:

По-видимому, это можно сделать с помощью https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures

  • они могут видеть классы основного исходного набора
  • источники тестов могут видеть классы тестовых приспособлений

Итак, изменения в примере в вопросе следующие:

  1. изменение src/test на src/testFixtures
  2. объявление зависимости как testImplementation(testFixtures(project(":testlib")))
  3. Добавление java-test-fixtures плагина в модуль build.gradle.kts для testlib модуля