Плагин 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")
}
Другие вопросы по тегам