Partager le code de test dans Maven

183

Comment pouvez-vous compter sur le code de test d'un autre module dans Maven?

Exemple, j'ai 2 modules:

  • Base
  • Principale

Je voudrais un cas de test dans Main pour étendre une classe de test de base dans Base. Est-ce possible?

Mise à jour: une réponse acceptable a été trouvée , ce qui implique la création d'un fichier jar de test.

flicken
la source
1
Il semble qu'une réponse équivalente à la combinaison de la réponse acceptée ci-dessous, qui est en fait une note sur la réponse plus large ci-dessous, est maintenant sur le site de Maven: Comment créer un pot contenant des classes de test
David Tonhofer

Réponses:

189

Je recommande d'utiliser le type au lieu du classifier (voir aussi: classifier ). Il dit à Maven un peu plus explicitement ce que vous faites (et j'ai trouvé que m2eclipse et q4e l'aiment mieux).

<dependency>
  <groupId>com.myco.app</groupId>
  <artifactId>foo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>
Ben
la source
5
Devrait-il y avoir une entrée de dépendance distincte pour com.myco.app spécialement pour le type test-jar?
Noah Watkins
20
Pensez
user1338062
11
J'étais confus lors de la première lecture de cette réponse ... C'est en fait parce que cela n'a pas de sens en soi, vous devriez d'abord lire la réponse ci-dessous: stackoverflow.com/questions/174560
...
179

Merci pour la suggestion du module de base. Cependant, je préfère ne pas créer un nouveau module dans ce seul but.

Une réponse acceptable a été trouvée dans la documentation Surefire Maven et un blog . Voir aussi " Comment créer un fichier jar contenant des classes de test ".

Cela crée un fichier jar de code à partir de l' src/test/javautilisation du plugin jar afin que les modules avec des tests puissent partager du code.

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

Pour utiliser le JAR de test attaché qui a été créé ci-dessus, spécifiez simplement une dépendance sur l'artefact principal avec un classificateur de tests spécifié:

<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
la source
14
Notez qu'il peut y avoir des problèmes avec l'utilisation des tests <classifier> </ classifier dans la dépendance. À la place, utilisez <type> test-jar </type>. Voici un numéro dans Maven jira.codehaus.org/browse/MNG-2045 et un autre sans rapport dans IntelliJ youtrack.jetbrains.net/issue/IDEA-54254
Emil Sit
Cela m'a été très utile, mais j'ai trouvé un problème: lorsque j'exécute "install -Dmaven.test.skip = true", le test-jar de dépendance est également requis et le processus échoue
Javi Pedrera
@JaviPedrera cela fonctionne pour moi même si je fais 'mvn clean install -DskipTests = true' et que le test-jar créera. pas d'erreurs
Karussell
1
@Allen vous êtes-vous assuré d'utiliser le ServiceResultTransformer lors de l'emballage de votre pot? Sinon, vous risquez de vous retrouver avec des fichiers de service qui s’écrasent.
jontejj
1
maven.apache.org/plugins/maven-shade-plugin/examples/ ... ici, vous pouvez en savoir plus.
jontejj
12

Nous avons résolu ce problème en créant un projet maven avec du code de test comme src / main / java et en ajoutant la dépendance suivante aux projets:

    <dependency>
        <groupId>foo</groupId>
        <artifactId>test-base</artifactId>
        <version>1</version>
        <scope>test</scope>
    </dependency>
sal
la source
Oui, ça marcherait, merci! Voir mon commentaire ci-dessous pour une autre réponse que je préfère.
filmé
1
Nous utilisons également cette approche, c'est un peu ridicule que vous soyez obligé d'opter pour des classificateurs ou des types (qui ne sont guère des bases de Maven pour la plupart des utilisateurs) et que vous devez construire JAR avec un certain effort lorsque vous n'en avez pas vraiment besoin ou - comme dans ce cas - vous avez de facto du code non test comme base uniquement pour le code test.
virgo47
-3

Oui ... incluez simplement le module Base en tant que dépendance dans Main. Si vous n'héritez que du code de test, vous pouvez utiliser la balise scope pour vous assurer que Maven n'inclut pas le code dans votre artefact lors du déploiement. Quelque chose comme ça devrait fonctionner:

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