Ich habe ein Maven-Projekt mit mehreren Modulen. Betrachten Sie für dieses Beispiel zwei Module:
data
consumer
Modul consumer
hat Modul data
als Abhängigkeit.
Das Modul data
deklariert eine Reihe von Kernklassen. Es gibt Tests src/test
, bei denen sie verwendet werden. Diese Tests erfordern eine langwierige Objekterstellung, daher habe ich eine Klasse mit einigen Dienstprogrammmethoden zum Erstellen dieser Objekte. Diese Utility-Klasse ( SampleDataHelper
) befindet sich in der src/test
Hierarchie.
Ich habe auch einige Tests im consumer
Modul, die einige dieser langwierigen Objekte erstellen müssen. Ich möchte meine SampleDataHelper
Klasse (definiert in data src/test
) in Tests verwenden, die sich in meinem consumer src/test
Baum befinden. Leider, obwohl data
eine Abhängigkeit von consumer
, consumer
kann nicht die Klassen sehen , die unter existieren data src/test
.
Um dies zu bekämpfen, dachte ich , ich könnte schaffen ein anderes Modul ( data-test
), und zu bewegen , SampleDataHelper
um es unter src/main
. Dann würde ich data-test
als Testumfang Abhängigkeit von einschließen data
. Leider führt dies zu einer zirkulären Abhängigkeit: data
verwendet data-test
, data-test
erfordert aber auch data
.
Die einzige Lösung, die ich mir ausgedacht habe, besteht darin, sie SampleDataHelper
unter data src/main
ein test
Paket zu stellen und zu hoffen, dass kein wirklicher Anwendungscode sie jemals aufruft.
Wie kann ich meine SampleDataHelper
Klasse zwischen Modulen teilen, ohne sie zu unterstellen src/main
?
data
), bevor ich überhaupt mein zweites Modul kompilieren kann (consumer
).mvn package
, aber es sollte in einem einzigen Schritt Build gut funktionieren, wenn Siemvn install
oder verwendenmvn deploy
. Nur eine schnelle Anmerkung. In einem unserer großen Projekte haben wir einen Wrapper über JunitsTestBase
und dieser befindet sich, insrc/main
dem ich es auch nicht für eine gute Idee halte.Antworten:
Ihr Verbraucherprojekt hängt von Ihrem Datenprojekt ab. Daher freuen wir uns, dass Daten vor dem Verbraucher erstellt werden müssen. Infolgedessen würde ich mithilfe der in den Kommentaren vorgeschlagenen Techniken sicherstellen, dass Ihr Datenprojekt den gesamten Testcode enthält, den Sie freigeben möchten, und das POM so konfigurieren, dass eine Test-JAR erstellt wird:
Ihr Consumer-Projekt würde dann sowohl vom normalen Data JAR-Artefakt als auch vom zusätzlichen
test-jar
Artefakt abhängen , mit natürlichem Testumfang:Ich habe diesen Ansatz bei vielen Gelegenheiten verwendet und er funktioniert gut.
quelle
Das Problem ist also, dass (einige) Tests im
data
Modul von derSampleDataHelper
Klasse abhängen ? Sie können dieSampleDataHelper
Klasse insrc/main
dasdata-test
Modul verschieben, wenn Sie gleichzeitig die Tests (die von der jeweiligen Klasse abhängen) insrc/test
dasdata-test
Modul verschieben. Folglich würde es keine zirkulären Abhängigkeiten mehr geben.quelle
SampleDataHelper
entweder vomdata
Modul oder vomconsumer
Modul (je nach Bedarf) in das Modul zu verschiebendata-test
. Leider finde ich dies keine sehr "nette" Lösung, da meine Tests aus dem getesteten Modul in ein anderes verschoben werden. (Genau genommen haben Sie nur gesagt, dass Sie diedata
Tests verschieben sollen, aber ich denke, ich würde beide aus Gründen der Konsistenz verschieben.) Aber danke für deine Antwort. :-)data-test
Modul vom Modul abhängen solltedata
(und nicht umgekehrt). Um die zirkuläre Abhängigkeit zu vermeiden, müssen alle Tests, die sich derzeit in demdata
Modul befinden, das dasSampleDataHelper
verwendet, in dasdata-test
Modul verschoben werden.