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

Lesezeit: 5 Minuten

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

  • data
  • consumer

Modul consumer Modul hat data als Abhängigkeit.

Modul data deklariert eine Reihe von Kernklassen. Es gibt Tests unter src/test die sie benutzen. Diese Tests erfordern eine langwierige Objekterstellung, daher habe ich eine Klasse mit einigen Hilfsmethoden darin, um diese Objekte zu erstellen. Diese Utility-Klasse (SampleDataHelper) ist in dem src/test Hierarchie.

Ich habe auch einige Tests in der consumer Modul, das einige dieser langatmigen Objekte erstellen muss. Ich möchte meine verwenden SampleDataHelper Klasse (definiert in data src/test) in Tests, die sich in meinem befinden consumer src/test Baum. Leider, obwohl data ist eine Abhängigkeit von consumer, consumer kann die Klassen nicht sehen, die unter vorhanden sind data src/test.

Um dem entgegenzuwirken, dachte ich, ich könnte etwas erschaffen Ein weiterer Modul (data-test) und bewegen SampleDataHelper dazu unter src/main. Dann würde ich einschließen data-test Als ein Testumfang Abhängigkeit von data. Leider führt dies zu einer zirkulären Abhängigkeit: data Verwendet data-testaber data-test erfordert auch data.

Die einzige Lösung, die ich mir ausgedacht habe, ist zu platzieren SampleDataHelper unter data src/main unter einem test Paket und hoffen, dass kein echter Anwendungscode es jemals aufruft.

Wie kann ich meine teilen SampleDataHelper Klasse zwischen den Modulen ohne unterlegen src/main?

  • Sehen Sie sich diese Antwort an. Ich denke, es sollte dir helfen.

    – Andreas Logwinow

    6. Februar 2013 um 6:31 Uhr

  • Für zukünftige Leser: Maven-Leitfaden zur Verwendung angehängter Tests

    – Greg Kopff

    6. Februar 2013 um 6:36 Uhr

  • @AndrewLogvinov: Würde Ihre verknüpfte Antwort nicht einen “zweistufigen” Build erfordern? Zum ersten bauen und einsetzen ein Modul (data) bevor ich überhaupt mein zweites Modul kompilieren kann (consumer).

    – Greg Kopff

    6. Februar 2013 um 6:42 Uhr

  • ich denke du könnte bei der Verwendung auf einige Probleme stoßen mvn packageaber es sollte in einem einzigen Schritt funktionieren, wenn Sie es verwenden mvn install oder mvn deploy. Nur eine schnelle Anmerkung. In einem unserer großen Projekte haben wir einen Wrapper über Junit’s TestBase und es befindet sich in src/main was ich auch nicht für eine gute Idee halte.

    – Andreas Logwinow

    6. Februar 2013 um 6:58 Uhr

Benutzer-Avatar
Duncan Jones

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 mit den in den Kommentaren vorgeschlagenen Techniken sicherstellen, dass Ihr Datenprojekt den gesamten Testcode enthält, den Sie freigeben möchten, und das POM konfigurieren, um ein Test-JAR zu erstellen:

<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 Verbraucherprojekt würde dann sowohl vom normalen Daten-JAR-Artefakt als auch vom zusätzlichen abhängen test-jar Artefakt, natürlich mit 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.

  • in Bezug auf “Ihr Consumer-Projekt würde dann sowohl vom normalen Daten-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 auch meine Artefakte namens data & Consumer) pom, ohne spezifische Versionsangabe erhielt der Pom einen Fehler. Warum ist das passiert?

    – Johnny

    20. August 2015 um 13:17 Uhr

  • @StasS, wahrscheinlich am besten, du öffnest eine separate Frage dazu.

    – Duncan Jones

    21. August 2015 um 11:39 Uhr

  • Hat es geschafft 🙂 stackoverflow.com/questions/32119591/…

    – Johnny

    21. August 2015 um 12:57 Uhr

Benutzer-Avatar
matsev

Das Problem ist also, dass (einige) Tests in der data Modul abhängig von der SampleDataHelper Klasse? Sie können die verschieben SampleDataHelper Klasse zu src/main des data-test Modul, wenn Sie gleichzeitig die Tests (die von der jeweiligen Klasse abhängen) in das verschieben src/test des data-test Modul. Folglich gäbe es keine zirkulären Abhängigkeiten mehr.

  • Wenn ich Sie verstehe, schlagen Sie vor, dass alle Tests, die verwenden SampleDataHelper bewegt werden entweder von der data Modul oder das consumer Modul (gegebenenfalls) in data-test. Leider finde ich das keine sehr “saubere” Lösung, da es meine Tests aus dem Modul, das sie testen, in ein anderes verschiebt. (Genau genommen sagten Sie nur, die zu verschieben data Tests, aber ich denke, ich würde beide aus Gründen der Konsistenz verschieben). Aber danke für deine Antwort. 🙂

    – Greg Kopff

    6. Februar 2013 um 6:48 Uhr


  • Ja, du hast mich richtig verstanden. Und es ist wohl eher eine schnelle Lösung als eine ordentliche. 🙂

    – matsev

    6. Februar 2013 um 7:48 Uhr

  • Ich würde mir vorstellen, dass die zirkulären Abhängigkeiten bestehen bleiben würden. Unter der Annahme, dass die fraglichen Tests die im Data-Projekt definierten Klassen ausführen, müsste immer noch ein Verweis zurück zum Data-Projekt aus dem Data-Test-Projekt vorhanden sein.

    – Duncan Jones

    6. Februar 2013 um 7:49 Uhr

  • @DuncanJones Entschuldigung, in meinem Beitrag war ein kleiner Tippfehler. Der Punkt, den ich zu machen versuche, ist, dass die data-test Modul sollte davon abhängen data Modul (und nicht umgekehrt). Um die zirkuläre Abhängigkeit zu vermeiden, werden alle Tests, die sich derzeit in der data Modul, das die verwendet SampleDataHelper muss verschoben werden data-test Modul.

    – matsev

    6. Februar 2013 um 8:15 Uhr

  • Gotcha, das macht mehr Sinn.

    – Duncan Jones

    6. Februar 2013 um 9:47 Uhr

1344660cookie-checkGemeinsame Nutzung von src/test-Klassen zwischen Modulen in einem Maven-Projekt mit mehreren Modulen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy