Teilen von src / test-Klassen zwischen Modulen in einem Maven-Projekt mit mehreren Modulen

120

Ich habe ein Maven-Projekt mit mehreren Modulen. Betrachten Sie für dieses Beispiel zwei Module:

  • data
  • consumer

Modul consumerhat Modul dataals Abhängigkeit.

Das Modul datadeklariert 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/testHierarchie.

Ich habe auch einige Tests im consumerModul, die einige dieser langwierigen Objekte erstellen müssen. Ich möchte meine SampleDataHelperKlasse (definiert in data src/test) in Tests verwenden, die sich in meinem consumer src/testBaum befinden. Leider, obwohl dataeine Abhängigkeit von consumer, consumerkann 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 , SampleDataHelperum es unter src/main. Dann würde ich data-testals Testumfang Abhängigkeit von einschließen data. Leider führt dies zu einer zirkulären Abhängigkeit: dataverwendet data-test, data-testerfordert aber auch data.

Die einzige Lösung, die ich mir ausgedacht habe, besteht darin, sie SampleDataHelperunter data src/mainein testPaket zu stellen und zu hoffen, dass kein wirklicher Anwendungscode sie jemals aufruft.

Wie kann ich meine SampleDataHelperKlasse zwischen Modulen teilen, ohne sie zu unterstellen src/main?

Greg Kopff
quelle
1
Schauen Sie sich diese Antwort an . Ich denke, es sollte dir helfen.
Andrew Logvinov
7
Für zukünftige Leser: Maven Leitfaden zur Verwendung von angehängten Tests
Greg Kopff
@ AndrewLogvinov: Würde Ihre verknüpfte Antwort nicht einen "zweistufigen" Build erfordern? Zuerst ein Modul erstellen und bereitstellen ( data), bevor ich überhaupt mein zweites Modul kompilieren kann ( consumer).
Greg Kopff
Ich denke, Sie könnten auf einige Probleme stoßen, wenn Sie verwenden mvn package, aber es sollte in einem einzigen Schritt Build gut funktionieren, wenn Sie mvn installoder verwenden mvn deploy. Nur eine schnelle Anmerkung. In einem unserer großen Projekte haben wir einen Wrapper über Junits TestBaseund dieser befindet sich, in src/maindem ich es auch nicht für eine gute Idee halte.
Andrew Logvinov

Antworten:

152

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:

<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>

Ihr Consumer-Projekt würde dann sowohl vom normalen Data JAR-Artefakt als auch vom zusätzlichen test-jarArtefakt abhängen , mit natürlichem Testumfang:

<dependency>
  <groupId>com.foo</groupId>
  <artifactId>data</artifactId>
  <version>1.0</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

Ich habe diesen Ansatz bei vielen Gelegenheiten verwendet und er funktioniert gut.

Duncan Jones
quelle
1
in Bezug auf "Ihr Consumer-Projekt würde dann sowohl vom normalen Data JAR-Artefakt als auch vom zusätzlichen Test-Jar-Artefakt abhängen", wenn ich beide Abhängigkeiten von Daten zum Consumer hinzufüge (sagen wir, meine Artefakte heißen auch data & consumer) pom, ohne spezifische versionsspezifikation bekam der pom fehler. Warum ist das so?
Johnny
@StasS wahrscheinlich am besten Sie öffnen eine separate Frage dazu.
Duncan Jones
1

Das Problem ist also, dass (einige) Tests im dataModul von der SampleDataHelperKlasse abhängen ? Sie können die SampleDataHelperKlasse in src/maindas data-testModul verschieben, wenn Sie gleichzeitig die Tests (die von der jeweiligen Klasse abhängen) in src/testdas data-testModul verschieben. Folglich würde es keine zirkulären Abhängigkeiten mehr geben.

matsev
quelle
1
Wenn ich Sie verstehe, schlagen Sie vor, alle verwendeten Tests SampleDataHelperentweder vom dataModul oder vom consumerModul (je nach Bedarf) in das Modul zu verschieben data-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 die dataTests verschieben sollen, aber ich denke, ich würde beide aus Gründen der Konsistenz verschieben.) Aber danke für deine Antwort. :-)
Greg Kopff
1
Ja, du hast mich richtig verstanden. Und es ist wohl eher eine schnelle als eine ordentliche Lösung. :-)
Matsev
Ich würde mir vorstellen, dass die zirkulären Abhängigkeiten bestehen bleiben. Unter der Annahme, dass die fraglichen Tests die im Datenprojekt definierten Klassen ausüben, müsste noch ein Verweis auf das Datenprojekt aus dem Datentestprojekt vorhanden sein.
Duncan Jones
1
@ DuncanJones Sorry, in meinem Beitrag war ein kleiner Tippfehler. Der Punkt, den ich versuche, ist, dass das data-testModul vom Modul abhängen sollte data(und nicht umgekehrt). Um die zirkuläre Abhängigkeit zu vermeiden, müssen alle Tests, die sich derzeit in dem dataModul befinden, das das SampleDataHelperverwendet, in das data-testModul verschoben werden.
Matsev
Gotcha, das macht mehr Sinn.
Duncan Jones