Mam wielomodułowy projekt Mavena. Na potrzeby tego przykładu rozważ dwa moduły:
data
consumer
Moduł consumer
ma moduł data
jako zależność.
Moduł data
deklaruje kilka podstawowych klas. Istnieją testy, src/test
które z nich korzystają. Te testy wymagają długiego tworzenia obiektów, więc mam klasę z kilkoma metodami użytkowymi do tworzenia tych obiektów. Ta klasa narzędziowa ( SampleDataHelper
) znajduje się w src/test
hierarchii.
Mam też kilka testów w consumer
module, które wymagają stworzenia niektórych z tych długich obiektów. Chcę używać mojej SampleDataHelper
klasy (zdefiniowanej w data src/test
) w testach znajdujących się w moim consumer src/test
drzewie. Niestety, mimo że data
jest to zależność consumer
, consumer
nie można zobaczyć klas, które istnieją w ramach data src/test
.
Aby temu zaradzić, pomyślałem, że mógłbym utworzyć kolejny moduł ( data-test
) i przejść SampleDataHelper
do niego pod src/main
. Następnie dodałbym data-test
jako zależność zakresu testowegodata
. Niestety, wprowadza to zależność cykliczną: data
używa data-test
, ale data-test
także wymaga data
.
Jedynym rozwiązaniem mam wymyślić ma miejsce SampleDataHelper
pod data src/main
ramach test
pakietu i nadziei, że żaden prawdziwy kod aplikacji kiedykolwiek nazywa go.
Jak mogę udostępniać moje SampleDataHelper
zajęcia między modułami bez umieszczania ich poniżej src/main
?
data
), zanim będę mógł skompilować drugi moduł (consumer
).mvn package
, ale powinna działać dobrze w jednym etapie kompilacji podczas korzystaniamvn install
lubmvn deploy
. Tylko krótka notatka. W jednym z naszych dużych projektów mamy opakowanie na junitTestBase
i jest ono zlokalizowane, wsrc/main
którym również nie uważam za dobry pomysł.Odpowiedzi:
Twój projekt konsumenta zależy od projektu danych, dlatego cieszymy się, że dane muszą zostać utworzone przed konsumentem. W rezultacie, korzystając z technik sugerowanych w komentarzach , upewnię się , że Twój projekt Data zawiera cały kod testowy, który chcesz udostępnić, i skonfiguruj POM do utworzenia testowego pliku JAR:
Twój projekt konsumenta będzie wtedy zależał zarówno od normalnego artefaktu Data JAR, jak i dodatkowego
test-jar
artefaktu, z oczywiście zakresem testowym:Używałem tego podejścia przy wielu okazjach i działa dobrze.
źródło
Problem w tym, że (niektóre) testy w
data
module zależą odSampleDataHelper
klasy? Można przesunąćSampleDataHelper
klasę dosrc/main
tegodata-test
modułu, jeśli w tym samym czasie przenieść testy (które zależą od konkretnej klasy) dosrc/test
tegodata-test
modułu. W konsekwencji nie byłoby więcej zależności cyklicznych.źródło
SampleDataHelper
zostały przeniesione zdata
modułu lubconsumer
modułu (w stosownych przypadkach) dodata-test
. Niestety nie uważam tego za bardzo „zgrabne” rozwiązanie, ponieważ przenosi moje testy z testowanego modułu do innego. (Ściśle mówiąc, powiedziałeś tylkodata
, żebym przesunął testy, ale myślę, że poruszałbym się zarówno dla spójności). Ale dziękuję za odpowiedź. :-)data-test
moduł powinien zależeć oddata
modułu (a nie na odwrót). Aby uniknąć zależności cyklicznej, wszystkie testy, które obecnie znajdują się wdata
module używającym elementu,SampleDataHelper
muszą zostać przeniesione dodata-test
modułu.