Compartir clases src / test entre módulos en un proyecto maven de varios módulos

120

Tengo un proyecto Maven de varios módulos. Por el bien de este ejemplo, considere dos módulos:

  • data
  • consumer

El módulo consumertiene un módulo datacomo dependencia.

El módulo datadeclara un montón de clases principales. Hay pruebas debajo src/testque 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/testjerarquía.

También tengo algunas pruebas en el consumermódulo que necesitan crear algunos de estos objetos prolijos. Quiero usar mi SampleDataHelperclase (definida en data src/test) en las pruebas que residen en mi consumer src/testárbol. Desafortunadamente, aunque dataes una dependencia de consumer, consumerno 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 SampleDataHelpera él debajo src/main. Luego incluiría data-testcomo alcance de prueba la dependencia de data. Desafortunadamente, esto introduce una dependencia circular: datausa data-test, pero data-testtambién requiere data.

La única solución que he llegado con es colocar SampleDataHelperbajo data src/mainbajo un testpaquete y la esperanza de que ningún código de aplicación real nunca lo llama.

¿Cómo puedo compartir mi SampleDataHelperclase entre módulos sin someterla src/main?

Greg Kopff
fuente
1
Mira esta respuesta . Creo que debería ayudarte.
Andrew Logvinov
7
Para futuros lectores: Guía de Maven para el uso de pruebas adjuntas
Greg Kopff
@AndrewLogvinov: ¿no requeriría su respuesta vinculada una compilación de "dos pasos"? Para construir e implementar primero un módulo ( data) antes de que pueda incluso compilar mi segundo módulo ( consumer).
Greg Kopff
Creo que puede encontrar algunos problemas si usa mvn package, pero debería funcionar bien en una compilación de un solo paso cuando usa mvn installo mvn deploy. Solo una nota rapida. En uno de nuestros grandes proyectos tenemos un wrapper sobre junit's TestBasey está ubicado en el src/mainque tampoco considero buena idea.
Andrew Logvinov

Respuestas:

152

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:

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

Su proyecto de consumidor dependería entonces del artefacto JAR de datos normal, más el test-jarartefacto adicional , con alcance de prueba, por supuesto:

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

He utilizado este enfoque en muchas ocasiones y funciona bien.

Duncan Jones
fuente
1
con respecto a "Su proyecto de consumidor dependería tanto del artefacto JAR de datos normal, más el artefacto de jar de prueba adicional", cuando agrego las dependencias de datos en el consumidor (digamos que mis artefactos llamados datos y consumidor también) pom, sin la especificación de versiones específicas, el pom tiene un error. ¿Por qué pasa eso?
Johnny
@StasS probablemente sea mejor que abra una pregunta separada sobre eso.
Duncan Jones
1

Entonces, ¿el problema es que (algunas) pruebas en el datamódulo dependen de la SampleDataHelperclase? Puede mover la SampleDataHelperclase a src/maindel data-testmódulo, si al mismo tiempo mueve las pruebas (que dependen de la clase específica) al src/testdel data-testmódulo. En consecuencia, no habría más dependencias circulares.

matsev
fuente
1
Si le entiendo, está sugiriendo que todas las pruebas que se utilicen SampleDataHelperse muevan del datamódulo o del consumermódulo (según corresponda) a data-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 las datapruebas, pero creo que me encontraría moviendo ambas por coherencia). Pero gracias por tu respuesta. :-)
Greg Kopff
1
Sí, me entendiste correctamente. Y podría decirse que es más una solución rápida que ordenada. :-)
matsev
Imagino que las dependencias circulares permanecerían. Suponiendo que las pruebas en cuestión ejercitan las clases definidas en el proyecto de datos, aún debería haber una referencia al proyecto de datos desde el proyecto de prueba de datos.
Duncan Jones
1
@DuncanJones Lo siento, hubo un pequeño error tipográfico en mi publicación. El punto que intento señalar es que el data-testmódulo debería depender del datamódulo (y no al revés). Para evitar la dependencia circular, todas las pruebas que residen actualmente en el datamódulo que usa el SampleDataHelperdeben trasladarse al data-testmódulo.
matsev
Entendido, eso tiene más sentido.
Duncan Jones