Совместное использование классов src/test между модулями в мультимодульном проекте maven
У меня есть мультимодульный проект Maven. Для этого примера рассмотрим два модуля:
Модуль 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
. Следовательно, больше не будет круговых зависимостей.