Обмін src / тестовими класами між модулями в багатомодульному проекті 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. Просто швидка примітка. В одному з наших великих проектів у нас є обгортка над юнітом, TestBaseі він розташований, в src/mainякому я також не вважаю гарною ідеєю.
Андрій Логвінов

Відповіді:


152

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

Я багато разів використовував цей підхід, і він працює добре.


1
стосовно "Ваш споживчий проект буде залежати від обох звичайних артефактів даних JAR, а також додаткового артефакту тестової банки", коли я додаю обидві залежності даних у споживача (скажімо так, мої артефакти також називають дані та споживачі), без конкретних специфікацій версій помилка отримала помилку. Чому так трапляється?
Джонні

@StasS, мабуть, найкраще відкрити окреме запитання з цього приводу.
Дункан Джонс


1

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


1
Якщо я вас розумію, ви пропонуєте SampleDataHelperперенести будь-які тести, які використовуються, або з dataмодуля, або з consumerмодуля (якщо потрібно) data-test. На жаль, я не вважаю це дуже "акуратним" рішенням, оскільки воно витісняє мої тести з модуля, який вони перевіряють, і в інший. (Строго кажучи, ви сказали лише перенести dataтести, але, думаю, я міг би рухатись обох для послідовності). Але дякую за вашу відповідь. :-)
Грег Копф

1
Так, ти мене правильно зрозумів. І, можливо, це швидше рішення, ніж акуратне. :-)
matsev

Я думаю, кругові залежності залишаться. Якщо припустити, що відповідні тести відповідають класам, визначеним у проекті «Дані», все одно потребуватиме посилання на проект «Дані» проекту «Тест даних».
Дункан Джонс

1
@DuncanJones Вибачте, у моєму дописі була невелика помилка. Я намагаюся зазначити, що data-testмодуль повинен залежати від dataмодуля (а не навпаки). Щоб уникнути кругової залежності, всі тести, які зараз знаходяться в dataмодулі, який використовує, SampleDataHelperповинні бути переміщені до data-testмодуля.
мацев

Є, що має більше сенсу.
Дункан Джонс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.