Compartir código de prueba en Maven

183

¿Cómo puede depender del código de prueba de otro módulo en Maven?

Ejemplo, tengo 2 módulos:

  • Base
  • Principal

Me gustaría un caso de prueba en Main para extender una clase de prueba base en Base. es posible?

Actualización: se encontró una respuesta aceptable , que implica crear un frasco de prueba.

flicken
fuente
1
Parece una respuesta equivalente a la combinación de la respuesta aceptada a continuación, que en realidad es una nota sobre la respuesta más grande que se encuentra más abajo, ahora está en el sitio de Maven: Cómo crear un frasco que contenga clases de prueba
David Tonhofer

Respuestas:

189

Recomiendo usar type en lugar de clasificador (ver también: clasificador ). Le dice a Maven un poco más explícitamente lo que está haciendo (y he descubierto que a m2eclipse y q4e les gusta más).

<dependency>
  <groupId>com.myco.app</groupId>
  <artifactId>foo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>
Ben
fuente
55
¿Debería haber una entrada de dependencia separada para com.myco.app especialmente para el tipo test-jar?
Noah Watkins
20
Recuerde también agregar test-jar a la configuración de plugin maven-jar: maven.apache.org/guides/mini/guide-attached-tests.html
user1338062
11
Estaba confundido cuando leí esta respuesta por primera vez ... Eso es realmente porque no tiene sentido por sí solo, primero debes leer la respuesta a continuación: stackoverflow.com/questions/174560/…
TanguyP
179

Gracias por la sugerencia del módulo base. Sin embargo, prefiero no crear un nuevo módulo solo para este propósito.

Encontré una respuesta aceptable en la documentación de Surefire Maven y en un blog . Consulte también " Cómo crear un jar que contiene clases de prueba ".

Esto crea un archivo jar de código a partir del src/test/javauso del complemento jar para que los módulos con pruebas puedan compartir código.

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.4</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

Para utilizar el JAR de prueba adjunto que se creó anteriormente, simplemente especifique una dependencia en el artefacto principal con un clasificador de pruebas especificado:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project> 
flicken
fuente
14
Tenga en cuenta que puede haber problemas con el uso de <classifier> tests </ classifier en la dependencia. En su lugar, use <type> test-jar </type>. Aquí hay un problema en Maven jira.codehaus.org/browse/MNG-2045 y otro no relacionado en IntelliJ youtrack.jetbrains.net/issue/IDEA-54254
Emil Sit
Me ha sido muy útil, pero he encontrado un problema: cuando ejecuto "install -Dmaven.test.skip = true", también se requiere el test-jar de dependencia y el proceso falla
Javi Pedrera
@JaviPedrera funciona para mí incluso si hago 'mvn clean install -DskipTests = true' y se creará el test-jar. sin errores
Karussell
1
@Allen, ¿se ha asegurado de utilizar el ServiceResultTransformer mientras empaqueta su frasco? De lo contrario, puede terminar con los archivos de servicio sobrescribiéndose entre sí.
jontejj
1
maven.apache.org/plugins/maven-shade-plugin/examples/… allí puede leer más al respecto.
jontejj
12

Resolvimos esto haciendo un proyecto maven con código de prueba como src / main / java y agregando la siguiente dependencia a los proyectos:

    <dependency>
        <groupId>foo</groupId>
        <artifactId>test-base</artifactId>
        <version>1</version>
        <scope>test</scope>
    </dependency>
sal
fuente
Sí, eso funcionaría, ¡gracias! Vea mi comentario a continuación para obtener una respuesta alternativa que prefiero.
flicken
1
También utilizamos este enfoque, es un poco tonto que te veas obligado a elegir clasificadores o tipos (que no son básicos en Maven para la mayoría de los usuarios) y que tienes que construir JAR con un poco de esfuerzo cuando realmente no necesitas o, como en este caso, tiene un código de no prueba de facto como base solo para el código de prueba.
virgo47
-3

Sí ... solo incluya el módulo Base como una dependencia en Main. Si solo está heredando el código de prueba, puede usar la etiqueta de alcance para asegurarse de que Maven no incluya el código en su artefacto cuando se implemente. Algo como esto debería funcionar:

<dependency>
    <groupId>BaseGroup</groupId>
    <artifactId>Base</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
Steve Moyer
fuente