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

120

У меня есть многомодульный проект 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
Посмотрите этот ответ . Я думаю, это должно тебе помочь.
Андрей Логвинов
@AndrewLogvinov: разве ваш связанный ответ не требует "двухэтапной" сборки? Сначала построить и развернуть один модуль ( data), прежде чем я смогу даже скомпилировать свой второй модуль ( consumer).
Грег Копфф
Я думаю, вы можете столкнуться с некоторыми проблемами, если используете mvn package, но он должен работать нормально в одноэтапной сборке, когда вы используете mvn installили mvn deploy. Просто небольшое примечание. В одном из наших крупных проектов у нас есть оболочка над junit, TestBaseи она находится в src/mainкоторой я тоже не считаю хорошей идеей.
Андрей Логвинов

Ответы:

152

Ваш потребительский проект зависит от вашего проекта данных, поэтому мы рады, что данные должны быть созданы до потребителя. В результате, используя методы, предложенные в комментариях , я бы обеспечил, чтобы ваш проект 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>

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

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

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

Дункан Джонс
источник
1
относительно того, что «ваш проект Consumer будет зависеть как от обычного артефакта Data JAR, так и от дополнительного артефакта test-jar», когда я добавляю обе зависимости данных в потребитель (скажем, мои артефакты с именем data и consumer) pom, без спецификации конкретной версии, pom получил ошибку. Почему так случилось?
Джонни
@StasS, наверное, лучше всего задать об этом отдельный вопрос.
Дункан Джонс
Сделал это :) stackoverflow.com/questions/32119591/…
Джонни
1

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

matsev
источник
1
Если я вас понимаю, вы предлагаете SampleDataHelperперенести все используемые тесты либо из dataмодуля, либо из consumerмодуля (в зависимости от ситуации) в data-test. К сожалению, я не считаю это очень «изящным» решением, поскольку оно перемещает мои тесты из модуля, который они тестируют, в другой. (Строго говоря, вы только сказали, что нужно переместить dataтесты, но я думаю, что переместил бы оба для согласованности). Но спасибо за ответ. :-)
Грег Копфф
1
Ага, вы меня правильно поняли. И, возможно, это скорее быстрое решение, чем изящное. :-)
мацев 06
Я предполагаю, что круговые зависимости останутся. Предполагая, что рассматриваемые тесты используют классы, определенные в проекте Data, все равно потребуется ссылка на проект Data из проекта Data-Test.
Дункан Джонс
1
@DuncanJones Извините, в моем сообщении была небольшая опечатка. Я пытаюсь сказать, что data-testмодуль должен зависеть от dataмодуля (а не наоборот). Чтобы избежать циклической зависимости, все тесты, которые в настоящее время находятся в dataмодуле, который использует, SampleDataHelperнеобходимо переместить в data-testмодуль.
matsev 06
Попался, в этом больше смысла.
Дункан Джонс