Testcode in Maven teilen

183

Wie können Sie sich auf Testcode aus einem anderen Modul in Maven verlassen?

Beispiel, ich habe 2 Module:

  • Base
  • Main

Ich möchte, dass ein Testfall in Main eine Basistestklasse in Base erweitert. Ist das möglich?

Update: Es wurde eine akzeptable Antwort gefunden , bei der ein Testglas erstellt wird.

flicken
quelle
1
Es scheint, dass eine Antwort, die der Kombination der unten akzeptierten Antwort entspricht, die eigentlich ein Hinweis auf die größere Antwort weiter unten ist, jetzt am Standort Maven ist: So erstellen Sie ein Glas mit
Testklassen

Antworten:

189

Ich empfehle die Verwendung von type anstelle von classifier (siehe auch: classifier ). Es sagt Maven etwas expliziter, was Sie tun (und ich habe festgestellt, dass es m2eclipse und q4e beide besser gefallen).

<dependency>
  <groupId>com.myco.app</groupId>
  <artifactId>foo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>
Ben
quelle
5
Sollte es einen separaten Abhängigkeitseintrag für com.myco.app speziell für den Test-Jar-Typ geben?
Noah Watkins
20
Denken Sie auch daran, test-jar zur Konfiguration des maven-jar-Plugins hinzuzufügen
user1338062
11
Ich war verwirrt, als ich diese Antwort zum ersten Mal las ... Das ist eigentlich so, weil es für sich genommen keinen Sinn macht. Sie sollten zuerst die folgende Antwort lesen: stackoverflow.com/questions/174560/…
TanguyP
179

Vielen Dank für den Vorschlag für das Basismodul. Ich möchte jedoch lieber kein neues Modul für diesen Zweck erstellen.

Eine akzeptable Antwort in der Surefire Maven-Dokumentation und in einem Blog gefunden . Siehe auch " So erstellen Sie ein Glas mit Testklassen ".

Dadurch wird src/test/javamithilfe des JAR-Plugins eine JAR-Codedatei erstellt, sodass Module mit Tests Code gemeinsam nutzen können.

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.4</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

Um die oben erstellte angehängte Test-JAR zu verwenden, geben Sie einfach eine Abhängigkeit vom Hauptartefakt mit einem angegebenen Klassifizierer von Tests an:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project> 
flicken
quelle
14
Beachten Sie, dass es Probleme bei der Verwendung von <classifier> tests </ classifier in der Abhängigkeit geben kann. Verwenden Sie stattdessen <type> test-jar </ type>. Hier ist ein Problem in Maven jira.codehaus.org/browse/MNG-2045 und ein nicht verwandtes in IntelliJ youtrack.jetbrains.net/issue/IDEA-54254
Emil Sit
Es war sehr nützlich für mich, aber ich habe ein Problem gefunden: Wenn ich "install -Dmaven.test.skip = true" ausführe, ist auch das Abhängigkeitstest-jar erforderlich und der Prozess schlägt fehl
Javi Pedrera
@JaviPedrera es funktioniert für mich auch dann, wenn ich 'mvn clean install -DskipTests = true' mache und das Test-jar erstellt wird. Keine Fehler
Karussell
1
@Allen Haben Sie sichergestellt, dass Sie den ServiceResultTransformer beim Verpacken Ihres Glases verwenden? Andernfalls können sich die Servicedateien gegenseitig überschreiben.
Jontejj
1
maven.apache.org/plugins/maven-shade-plugin/examples/… dort können Sie mehr darüber lesen.
Jontejj
12

Wir haben dieses Problem gelöst, indem wir ein Maven-Projekt mit Testcode als src / main / java erstellt und den Projekten die folgende Abhängigkeit hinzugefügt haben:

    <dependency>
        <groupId>foo</groupId>
        <artifactId>test-base</artifactId>
        <version>1</version>
        <scope>test</scope>
    </dependency>
sal
quelle
Ja, das würde funktionieren, danke! In meinem Kommentar unten finden Sie eine alternative Antwort, die ich bevorzuge.
flicken
1
Wir verwenden auch diesen Ansatz. Es ist ein bisschen albern, dass Sie gezwungen sind, Klassifikatoren oder Typen zu wählen (die für die meisten Benutzer in Maven kaum Grundlagen sind), und dass Sie JAR mit etwas Aufwand erstellen müssen, wenn Sie es nicht wirklich brauchen es oder - wie in diesem Fall - Sie haben de facto Nicht-Testcode als Basis nur für den Testcode.
Jungfrau47
-3

Ja ... fügen Sie einfach das Basismodul als Abhängigkeit in Main ein. Wenn Sie nur Testcode erben, können Sie mithilfe des Scope-Tags sicherstellen, dass Maven den Code bei der Bereitstellung nicht in Ihr Artefakt einbezieht. So etwas sollte funktionieren:

<dependency>
    <groupId>BaseGroup</groupId>
    <artifactId>Base</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
Steve Moyer
quelle