Плагин Gradle Test fixtures и зависимости основного модуля
У меня есть проект, созданный с помощью Gradle версии 6.4 и JDK 8. Я пытаюсь использовать плагин Gradle для Test Fixtures (java-test-fixtures
), но у меня есть проблемы с зависимостями.
Согласно указанной выше странице Gradle, проект должен быть структурирован следующим образом:
core-module
-- src
-- main
-- java
-- test
-- java
-- testFixtures
-- java
В то время как
build.gradle.kts
файл имеет следующий раздел зависимостей:
dependencies {
api("com.my.external.project:1.0")
// ... more API dependencies
testFixturesCompileOnly(project(":core-module"))
testFixturesApi("junit:junit:4.12")
// ... more test dependencies
}
Теперь в IntelliJ (IDE, которую я использую) классы в
testFixtures/java
исходная папка см. классы в
main/java
исходная папка. Итак, я могу добавить новые классы Java в
testFixtures/java
которые зависят от тех, кто находится под
main
. Однако я не смогу импортировать зависимости из внешней библиотеки.
com.my.external.project:1.0
. Проблема подтверждается, когда я пытаюсь запустить задачу Gradle
compileTestFixturesJava
.
Я могу продублировать запись в
dependencies
раздел; например, я могу добавить:
testFixturesImplementationOnly("com.my.external.project:1.0")
Но на самом деле я не этого ожидал; особенно когда у меня десятки зависимостей.
Я также мог определить зависимости в массиве и запустить
for-each
Над ними. Тем не менее, это не самое чистое решение.
Есть ли чистое решение, которое позволит
testFixtures
модуль для использования зависимостей, объявленных в
main
модуль?
1 ответ
Самая важная концепция в Gradle
java-test-fixtures
плагин указан в их документации:
[этот плагин] автоматически создаст исходный набор testFixtures, в который вы можете писать свои тестовые фикстуры. Контрольные приборы настроены так, чтобы:
- они могут видеть основные классы исходного набора
- источники тестов могут видеть классы тестовых приспособлений
Этот плагин действительно создаст следующие зависимости:
main
<-
testFixtures
, и
testFixtures
<-
test
В твоем случае,
testFixtures
модуль должен автоматически зависеть от
main
источники, а также на
main
зависимости, объявленные в
api
объем (com.my.extenal.project:1.0
)
См. Аналогичный пример в действующем образце проекта здесь https://github.com/mricciuti/so-64133013:
- У класса Симпсонов есть доступ к
Person
класс из основного модуля - Класс TestHelpers имеет доступ к
main
зависимости, объявленные вapi
конфигурация
Обратите внимание, что
testFixtures
не будет наследовать зависимости от
test
модуль: если вам нужно использовать такие библиотеки в этом модуле (например, JUnit, Mockito, ...), вам нужно будет объявить явную зависимость, используя
testFixturesImplementation
или же
testFixturesApi
конфигурация.
См. Пример в core-module
plugins {
id ("java-library")
id ("java-test-fixtures")
}
dependencies {
// Main dependencies
// will be available in "testFixture" as well thanks to "api" configuration
api("org.apache.commons:commons-lang3:3.9")
api(project(":utils-module"))
// Testfixture dependencies
// ==> mockito lib will be available in testFixture module and also in consumer modules (e.g test)
testFixturesApi("org.mockito:mockito-core:3.5.13")
// Test dependencies
// dependencies specific to the "test" module; not visible from "testFixtures"
testImplementation("org.junit.jupiter:junit-jupiter-api:5.3.1")
testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.3.1")
}