Partage de classes src / test entre modules dans un projet maven multi-module

120

J'ai un projet Maven multi-module. Pour cet exemple, considérons deux modules:

  • data
  • consumer

Le module consumera le module datacomme dépendance.

Le module datadéclare un tas de classes principales. Il y a des tests sous src/testqui les utilisent. Ces tests nécessitent une création d'objets de longue haleine, j'ai donc une classe avec des méthodes utilitaires pour créer ces objets. Cette classe utilitaire ( SampleDataHelper) est dans la src/testhiérarchie.

J'ai également quelques tests dans le consumermodule qui doivent créer certains de ces objets longs. Je souhaite utiliser ma SampleDataHelperclasse (définie dans data src/test) dans les tests qui résident dans mon consumer src/testarbre. Malheureusement, même s'il datas'agit d'une dépendance de consumer, consumerne peut pas voir les classes qui existent sous data src/test.

Pour lutter contre cela, j'ai pensé que je pourrais créer un autre module ( data-test) et passer SampleDataHelperà celui-ci sous src/main. Ensuite, j'inclurais data-testcomme une dépendance de portée de test de data. Malheureusement, cela introduit une dépendance circulaire: datautilise data-test, mais data-testnécessite également data.

La seule solution que je suis venu avec est à placer SampleDataHelpersous le data src/maincadre d' un testpaquet et d' espoir qu'aucun code d'application réelle que jamais il appelle.

Comment puis-je partager ma SampleDataHelperclasse entre les modules sans la mettre sous src/main?

Greg Kopff
la source
1
Découvrez cette réponse . Je pense que cela devrait vous aider.
Andrew Logvinov
7
Pour les futurs lecteurs: Guide Maven sur l'utilisation des tests attachés
Greg Kopff
@AndrewLogvinov: votre réponse liée ne nécessiterait-elle pas une compilation en "deux étapes"? Créer et déployer d'abord un module ( data) avant même de pouvoir compiler mon deuxième module ( consumer).
Greg Kopff
Je pense que vous pourriez rencontrer des problèmes si vous utilisez mvn package, mais cela devrait fonctionner très bien en une seule étape lorsque vous utilisez mvn installou mvn deploy. Juste un petit mot. Dans l'un de nos grands projets, nous avons un wrapper sur junit TestBaseet il se trouve dans src/mainlequel je ne considère pas non plus comme une bonne idée.
Andrew Logvinov

Réponses:

152

Votre projet consommateur dépend de votre projet Data, nous sommes donc heureux que les données doivent être construites avant Consumer. En conséquence, en utilisant les techniques suggérées dans les commentaires , je m'assurerais que votre projet Data contient tout le code de test que vous souhaitez partager et configurer le POM pour produire un JAR de test:

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

Votre projet Consumer dépendra alors à la fois de l'artefact Data JAR normal, ainsi que de l' test-jarartefact supplémentaire , avec la portée du test bien sûr:

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

J'ai utilisé cette approche à plusieurs reprises et cela fonctionne bien.

Duncan Jones
la source
1
concernant "Votre projet consommateur dépendrait alors à la fois de l'artefact Data JAR normal et de l'artefact test-jar supplémentaire", lorsque j'ajoute les dépendances des données dans consumer (disons mes artefacts nommés data & consumer également) pom, sans spécification de versions spécifiques, le pom a obtenu une erreur. Pourquoi est-ce arrivé?
Johnny
@StasS ferait probablement mieux d'ouvrir une question distincte à ce sujet.
Duncan Jones
1

Donc le problème est que (certains) tests du datamodule dépendent de la SampleDataHelperclasse? Vous pouvez déplacer la SampleDataHelperclasse vers src/mainle data-testmodule, si vous déplacez en même temps les tests (qui dépendent de la classe spécifique) vers le src/testdu data-testmodule. Par conséquent, il n'y aurait plus de dépendances circulaires.

matsev
la source
1
Si je comprends bien, vous suggérez que tous les tests qui utilisent SampleDataHelpersoient déplacés du datamodule ou du consumermodule (selon le cas) vers data-test. Malheureusement, je ne trouve pas cette solution très "soignée" car elle déplace mes tests hors du module qu'ils testent et dans un autre. (Strictement parlant, vous avez seulement dit de déplacer les datatests, mais je pense que je me retrouverais à déplacer les deux par souci de cohérence). Mais merci pour ta réponse. :-)
Greg Kopff
1
Oui, vous m'avez bien compris. Et sans doute, c'est plus une solution rapide qu'une solution soignée. :-)
matsev
J'imagine que les dépendances circulaires resteraient. En supposant que les tests en question exercent les classes définies dans le projet Data, il faudrait encore une référence au projet Data du projet Data-Test.
Duncan Jones
1
@DuncanJones Désolé, il y avait une petite faute de frappe dans mon message. Le point que j'essaie de faire est que le data-testmodule doit dépendre du datamodule (et non l'inverse). Pour éviter la dépendance circulaire, tous les tests qui résident actuellement dans le datamodule qui utilise le SampleDataHelperdoivent être déplacés vers le data-testmodule.
matsev
Gotcha, cela a plus de sens.
Duncan Jones