Совместное использование классов src/test между модулями в мультимодульном проекте maven

У меня есть мультимодульный проект Maven. Для этого примера рассмотрим два модуля:

  • data
  • consumer

Модуль consumer имеет модуль data как зависимость.

Модуль data объявляет кучу основных классов. Существуют тесты под src/test, которые используют их. Эти тесты требуют некоторого создания длинного объекта, поэтому у меня есть класс с некоторыми методами утилиты, чтобы создавать эти объекты. Этот класс утилиты (SampleDataHelper) находится в иерархии src/test.

У меня также есть несколько тестов в модуле consumer, которым необходимо создать некоторые из этих объектов с длинной ветвью. Я хочу использовать класс SampleDataHelper (определенный в data src/test) в тестах, которые находятся в моем дереве consumer src/test. К сожалению, хотя data является зависимостью от consumer, consumer не может видеть классы, которые существуют в data src/test.

Чтобы бороться с этим, я подумал, что могу создать еще один модуль (data-test) и переместить SampleDataHelper в него под src/main. Тогда я бы включил data-test в качестве зависимости от области проверки data. К сожалению, это вводит циклическую зависимость: data использует data-test, но data-test также требует data.

Единственное решение, с которым я столкнулся, - это разместить SampleDataHelper под data src/main в пакете test и надеяться, что никакой код приложения никогда не назовет его.

Как я могу поделиться своим классом SampleDataHelper между модулями, не помещая его под src/main?

Ответ 1

Ваш потребительский проект зависит от вашего проекта Data, поэтому мы рады, что Data должны быть созданы до Потребителя. В результате, используя методы, предложенные в комментариях, я бы гарантировал, что ваш проект данных содержит весь тестовый код, который вы хотите разделить, и настройте POM для создания теста JAR:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.2</version>
  <executions>
    <execution>
      <goals>
        <goal>test-jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Ваш потребительский проект будет зависеть как от обычного артефакта данных JAR, так и от дополнительного артефакта test-jar, с областью тестирования, конечно:

<dependency>
  <groupId>com.foo</groupId>
  <artifactId>data</artifactId>
  <version>1.0</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

Я использовал этот подход во многих случаях, и он работает хорошо.

Ответ 2

Итак, проблема в том, что (некоторые) тесты в модуле data зависят от класса SampleDataHelper? Вы можете переместить класс SampleDataHelper в src/main модуля data-test, если вы в то же время переместите тесты (которые зависят от конкретного класса) с модулем src/test модуля data-test. Следовательно, больше не будет круговых зависимостей.