Tengo un proyecto Maven de varios módulos. Por el bien de este ejemplo, considere dos módulos:
data
consumer
El módulo consumer
tiene un módulo data
como dependencia.
El módulo data
declara un montón de clases principales. Hay pruebas debajo src/test
que los usan. Estas pruebas requieren una creación de objetos prolija, así que tengo una clase con algunos métodos de utilidad para crear estos objetos. Esta clase de utilidad ( SampleDataHelper
) está en la src/test
jerarquía.
También tengo algunas pruebas en el consumer
módulo que necesitan crear algunos de estos objetos prolijos. Quiero usar mi SampleDataHelper
clase (definida en data src/test
) en las pruebas que residen en mi consumer src/test
árbol. Desafortunadamente, aunque data
es una dependencia de consumer
, consumer
no se pueden ver las clases que existen debajo data src/test
.
Para combatir esto, pensé que podría crear otro módulo ( data-test
) y pasar SampleDataHelper
a él debajo src/main
. Luego incluiría data-test
como alcance de prueba la dependencia de data
. Desafortunadamente, esto introduce una dependencia circular: data
usa data-test
, pero data-test
también requiere data
.
La única solución que he llegado con es colocar SampleDataHelper
bajo data src/main
bajo un test
paquete y la esperanza de que ningún código de aplicación real nunca lo llama.
¿Cómo puedo compartir mi SampleDataHelper
clase entre módulos sin someterla src/main
?
data
) antes de que pueda incluso compilar mi segundo módulo (consumer
).mvn package
, pero debería funcionar bien en una compilación de un solo paso cuando usamvn install
omvn deploy
. Solo una nota rapida. En uno de nuestros grandes proyectos tenemos un wrapper sobre junit'sTestBase
y está ubicado en elsrc/main
que tampoco considero buena idea.Respuestas:
Su proyecto de consumidor depende de su proyecto de datos, por lo tanto, nos complace que los datos deban construirse antes que el consumidor. Como resultado, utilizando las técnicas sugeridas en los comentarios , me aseguraría de que su proyecto de datos contenga todo el código de prueba que desea compartir y configurar el POM para producir un JAR de prueba:
Su proyecto de consumidor dependería entonces del artefacto JAR de datos normal, más el
test-jar
artefacto adicional , con alcance de prueba, por supuesto:He utilizado este enfoque en muchas ocasiones y funciona bien.
fuente
Entonces, ¿el problema es que (algunas) pruebas en el
data
módulo dependen de laSampleDataHelper
clase? Puede mover laSampleDataHelper
clase asrc/main
deldata-test
módulo, si al mismo tiempo mueve las pruebas (que dependen de la clase específica) alsrc/test
deldata-test
módulo. En consecuencia, no habría más dependencias circulares.fuente
SampleDataHelper
se muevan deldata
módulo o delconsumer
módulo (según corresponda) adata-test
. Desafortunadamente, no encuentro que esta sea una solución muy "ordenada", ya que mueve mis pruebas fuera del módulo que prueban a uno diferente. (Estrictamente hablando, solo dijiste que moviera lasdata
pruebas, pero creo que me encontraría moviendo ambas por coherencia). Pero gracias por tu respuesta. :-)data-test
módulo debería depender deldata
módulo (y no al revés). Para evitar la dependencia circular, todas las pruebas que residen actualmente en eldata
módulo que usa elSampleDataHelper
deben trasladarse aldata-test
módulo.