J'ai un projet Maven multi-module. 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 tas de classes principales. Il y a 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 avec des méthodes utilitaires pour créer ces objets. Cette classe utilitaire ( SampleDataHelper
) est dans la src/test
hiérarchie.
J'ai également quelques tests dans le consumer
module qui doivent créer certains de ces objets longs. Je souhaite utiliser ma SampleDataHelper
classe (définie dans data src/test
) dans les tests qui résident dans mon consumer src/test
arbre. Malheureusement, même s'il data
s'agit d'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 passer SampleDataHelper
à celui-ci sous src/main
. Ensuite, j'inclurais data-test
comme une dépendance de portée de 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 je suis venu avec est à placer SampleDataHelper
sous le data src/main
cadre d' un test
paquet et d' espoir qu'aucun code d'application réelle que jamais il appelle.
Comment puis-je partager ma SampleDataHelper
classe entre les modules sans la mettre sous src/main
?
data
) avant même de pouvoir compiler mon deuxième module (consumer
).mvn package
, mais cela devrait fonctionner très bien en une seule étape lorsque vous utilisezmvn install
oumvn deploy
. Juste un petit mot. Dans l'un de nos grands projets, nous avons un wrapper sur junitTestBase
et il se trouve danssrc/main
lequel je ne considère pas non plus comme une bonne idée.Réponses:
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:
Votre projet Consumer dépendra alors à la fois de l'artefact Data JAR normal, ainsi que de l'
test-jar
artefact supplémentaire , avec la portée du test bien sûr:J'ai utilisé cette approche à plusieurs reprises et cela fonctionne bien.
la source
Donc le problème est que (certains) tests du
data
module dépendent de laSampleDataHelper
classe? Vous pouvez déplacer laSampleDataHelper
classe verssrc/main
ledata-test
module, si vous déplacez en même temps les tests (qui dépendent de la classe spécifique) vers lesrc/test
dudata-test
module. Par conséquent, il n'y aurait plus de dépendances circulaires.la source
SampleDataHelper
soient déplacés dudata
module ou duconsumer
module (selon le cas) versdata-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 lesdata
tests, mais je pense que je me retrouverais à déplacer les deux par souci de cohérence). Mais merci pour ta réponse. :-)data-test
module doit dépendre dudata
module (et non l'inverse). Pour éviter la dépendance circulaire, tous les tests qui résident actuellement dans ledata
module qui utilise leSampleDataHelper
doivent être déplacés vers ledata-test
module.