web-dev-qa-db-de.com

Teilen von Quell- / Testklassen zwischen Modulen in einem Multi-Modul-Maven-Projekt

Ich habe ein Maven-Projekt mit mehreren Modulen. In diesem Beispiel werden zwei Module betrachtet:

  • data
  • consumer

Modul consumer hat Modul data als Abhängigkeit.

Das Modul data deklariert eine Reihe von Kernklassen. Es gibt Tests unter src/test, Die diese verwenden. Diese Tests erfordern einige langwierige Objekterstellung, daher habe ich eine Klasse mit einigen Dienstprogrammmethoden, um diese Objekte zu erstellen. Diese Dienstprogrammklasse (SampleDataHelper) befindet sich in der Hierarchie src/test.

Ich habe auch einige Tests im Modul consumer, die einige dieser langatmigen Objekte erstellen müssen. Ich möchte meine Klasse SampleDataHelper (definiert in data src/test) In Tests verwenden, die sich in meinem Baum consumer src/test Befinden. Obwohl data eine Abhängigkeit von consumer ist, kann consumer die Klassen, die unter data src/test Existieren, leider nicht sehen.

Um dem entgegenzuwirken, dachte ich, ich könnte ein ein anderes Modul (data-test) Erstellen und SampleDataHelper unter src/main Dorthin verschieben.. Dann würde ich data-test Als Testumfang Abhängigkeit von data einfügen. Dies führt leider zu einer zirkulären Abhängigkeit: data verwendet data-test, Aber data-test Erfordert auch data.

Die einzige Lösung, die ich gefunden habe, ist, SampleDataHelper unter data src/main Unter einem test -Paket abzulegen und zu hoffen, dass kein wirklicher Anwendungscode es jemals aufruft.

Wie kann ich meine SampleDataHelper Klasse zwischen Modulen teilen ohne unter src/main Setzen?

105
Greg Kopff

Ihr Consumer-Projekt hängt von Ihrem Data-Projekt ab. Daher freuen wir uns, dass Data vor Consumer erstellt werden muss. Infolgedessen würde ich mit den vorgeschlagenen Techniken in den Kommentaren 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 Artefakt test-jar Mit Testumfang abhängen:

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

128
Duncan Jones

Das Problem ist also, dass (einige) Tests im Modul data von der Klasse SampleDataHelper abhängen. Sie können die Klasse SampleDataHelper in src/main Des Moduls data-test Verschieben, wenn Sie gleichzeitig die Tests (die von der jeweiligen Klasse abhängen) in die Klasse src/test Des Moduls data-test. Folglich würde es keine zirkulären Abhängigkeiten mehr geben.

1
matsev