web-dev-qa-db-fra.com

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

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

  • data
  • consumer

Le module consumer a le module data comme dépendance.

Le module data déclare un groupe de classes de base. Il existe des tests sous src/test Qui les utilisent. Ces tests nécessitent une création d’objets de longue haleine, j’ai donc une classe contenant des méthodes utilitaires pour créer ces objets. Cette classe d'utilitaires (SampleDataHelper) se trouve dans la hiérarchie src/test.

J'ai également quelques tests dans le module consumer qui ont besoin de créer certains de ces objets longs. Je souhaite utiliser ma classe SampleDataHelper (définie dans data src/test) Dans des tests qui résident dans mon arbre consumer src/test. Malheureusement, même si data est une dépendance de consumer, consumer ne 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 y déplacer SampleDataHelper sous - src/main. Ensuite, j'inclurais data-test En tant que dépendance de la portée du test de data. Malheureusement, cela introduit une dépendance circulaire: data utilise data-test, Mais data-test Nécessite également data.

La seule solution que j'ai proposée consiste à placer SampleDataHelper sous data src/main Sous un paquet test et à espérer qu'aucun code d'application réel ne l'appelle jamais.

Comment puis-je partager ma classe SampleDataHelper entre des modules sans la placer sous src/main?

105
Greg Kopff

Votre projet Consumer dépend de votre projet Data. Nous sommes donc heureux que les données doivent être créées avant Consumer. En conséquence, en utilisant les techniques suggérées dans les commentaires , je veillerais à ce que votre projet Data contienne tout le code de test que vous souhaitez partager et à configurer le POM pour produire un fichier 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épend alors à la fois de l’artefact normal du fichier JAR de données et du fichier test-jar artefact, avec la portée du test:

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

128
Duncan Jones

Le problème est donc que (certains) tests dans le module data dépendent de la classe SampleDataHelper? Vous pouvez déplacer la classe SampleDataHelper vers src/main du data-test module, si vous déplacez simultanément les tests (qui dépendent de la classe spécifique) vers le src/test du data-test module. Par conséquent, il n'y aurait plus de dépendances circulaires.

1
matsev