У меня есть многомодульный проект 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
?
data
), прежде чем я смогу даже скомпилировать свой второй модуль (consumer
).mvn package
, но он должен работать нормально в одноэтапной сборке, когда вы используетеmvn install
илиmvn deploy
. Просто небольшое примечание. В одном из наших крупных проектов у нас есть оболочка над junit,TestBase
и она находится вsrc/main
которой я тоже не считаю хорошей идеей.Ответы:
Ваш потребительский проект зависит от вашего проекта данных, поэтому мы рады, что данные должны быть созданы до потребителя. В результате, используя методы, предложенные в комментариях , я бы обеспечил, чтобы ваш проект Data содержал весь тестовый код, которым вы хотите поделиться, и настроил POM для создания тестового JAR:
Тогда ваш потребительский проект будет зависеть как от обычного артефакта Data JAR, так и от дополнительного
test-jar
артефакта, с областью тестирования, конечно:Я использовал этот подход много раз, и он хорошо работает.
источник
Итак, проблема в том, что (некоторые) тесты в
data
модуле зависят отSampleDataHelper
класса? Вы можете переместитьSampleDataHelper
классsrc/main
изdata-test
модуля, если вы в то же время двигаться тесты (которые зависят от класса конкретного) кsrc/test
изdata-test
модуля. Следовательно, больше не будет циклических зависимостей.источник
SampleDataHelper
перенести все используемые тесты либо изdata
модуля, либо изconsumer
модуля (в зависимости от ситуации) вdata-test
. К сожалению, я не считаю это очень «изящным» решением, поскольку оно перемещает мои тесты из модуля, который они тестируют, в другой. (Строго говоря, вы только сказали, что нужно переместитьdata
тесты, но я думаю, что переместил бы оба для согласованности). Но спасибо за ответ. :-)data-test
модуль должен зависеть отdata
модуля (а не наоборот). Чтобы избежать циклической зависимости, все тесты, которые в настоящее время находятся вdata
модуле, который использует,SampleDataHelper
необходимо переместить вdata-test
модуль.