156 votes

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

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

  • data
  • consumer

Module consumer a un module data en tant que dépendance.

Module data déclare un ensemble de classes de base. Il y a des tests sous src/test qui les utilisent. Ces tests nécessitent la création d'objets de longue haleine. J'ai donc créé une classe contenant quelques méthodes utilitaires pour créer ces objets. Cette classe utilitaire ( SampleDataHelper ) est dans la src/test hiérarchie.

J'ai aussi quelques tests dans le consumer qui ont besoin de créer certains de ces objets de longue haleine. Je veux utiliser mon SampleDataHelper (définie dans data src/test ) dans les tests qui se trouvent dans mon consumer src/test arbre. 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 combattre cela, j'ai pensé que je pourrais créer un autre module ( data-test ), et déplacer SampleDataHelper à ce sujet sous src/main . Ensuite, j'inclurais data-test en tant que portée du test dépendance à l'égard de data . Malheureusement, cela introduit une dépendance circulaire : data utilise data-test mais data-test exige également data .

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

Comment puis-je partager mon SampleDataHelper classe entre les modules sans le mettre sous src/main ?

202voto

Duncan Points 22780

Votre projet Consumer dépend de votre projet Data, c'est pourquoi nous sommes heureux que Data doive être construit avant Consumer. Par conséquent, en utilisant les techniques suggérées dans les commentaires Dans ce cas, je m'assurerais que votre projet Data contient tout le code de test que vous souhaitez partager et je configurerais 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épendrait alors à la fois de l'artefact JAR de données normal et de l'artefact supplémentaire test-jar artefact, 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 en de nombreuses occasions et elle fonctionne bien.

1voto

matsev Points 6761

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X