2010-08-25 6 views
13

Tengo un proyecto de Primavera módulo múltiples que he creado usando Maven:¿Recursos de prueba de las dependencias que no están en classpath?

my-root (pom) 
    - my-logic 
    - my-webapp (depending on my-logic) 
    - my-consoleapp (depending on my-logic) 

Mis clases de prueba heredan de AbstractTransactionalJUnit4SpringContextTests y utilizan @ContextCofiguration para configurar el ApplicationContext.

E.g. la clase de prueba para un controlador de primavera:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { 
    "classpath:applicationContext-logic-test.xml", 
    "classpath:applicationContext-web-test.xml"}) 
public class ControllerTest extends AbstractTransactionalJUnit4SpringContextTests { 

    @Autowired 
    private ApplicationContext applicationContext; 
    ... 
} 

Como puede ver, hay un XML de configuración por módulo. Tengo configuraciones separadas para tesear, que residen en pruebas/recursos de cada módulo (y que además tienen el sufijo "-test"). Todo esto funciona (la clase compila, ejecuta y las pruebas JUnit son exitosas) if Ejecuto la prueba JUnit en Eclipse.

Ahora a mi problema: Ejecutar la prueba con Maven ¡NO funcionará! (por ejemplo, con "Ejecutar como"> "Instalación de Maven" en my-root (uso m2eclipse)). En concreto, se lanzará la siguiente excepción:

java.io.FileNotFoundException: ruta de clase de recurso [applicationContext-lógica-test.xml] no se puede abrir porque no exist`

Parece que Maven no agrega los archivos desde my-logic/src/test/resources al classpath que se configura al ejecutar las pruebas unitarias de my-webapp.

¿Cómo puedo solucionar eso?

Respuesta

13

Parece que Maven no agrega los archivos de my-logic/src/test/resources al classpath que se configura al ejecutar las pruebas unitarias de my-webapp.

No, de hecho, no es así. Primero, Maven usa dependencias binarias que siempre se resuelven a través del repositorio local. Y segundo, las dependencias binarias no incluyen cosas de prueba.

Pero lo que podría hacer es:

  1. configurar el módulo my-logic para crear un JAR prueba usando jar:test-jar
  2. configurar el módulo my-webapp a depender de esta jarra de prueba (con un alcance test).

Para el n. ° 1, deberá configurar el plugin de Maven Jar en el pomo.xml de my-logic:

<project> 
    <build> 
    <plugins> 
    <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> 
    </plugins> 
    </build> 
</project> 

Y Maven creará un archivo JAR con el contenido de target/test-classes durante package e instalar/desplegarlo.

Para # 2, declara una dependencia de la jarra de prueba en el pom.xml de my-webapp:

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

Eso debería hacerlo.

+0

¡Muchas gracias por esta excelente respuesta! Usé esta solución y funciona. Ahora que ha explicado esto, es obvio para mí que los recursos de prueba de todas las dependencias (externas) no se incluyen en la ruta de clases. ¿Cómo deberían? Pero de alguna manera sería bueno si se incluyeran recursos de mis propios módulos. Aunque no sé exactamente cómo funcionaría esto, ahora que lo pienso;) – apropoz

+0

@apropoz De nada. La idea de Maven es que los módulos son autónomos: puedes pagar un solo módulo sin sus hermanos y construirlo. Cualquier cosa que implique caminos relativos rompería esto, lo cual no es deseable. –

1

Eso es por diseño. Los recursos de prueba no se colocan en el artefacto de salida, por lo que no se podrá acceder a las dependencias de prueba de algo de lo que dependa, incluso en el classpath de prueba de su unidad.

Si usted quiere lograr lo que estamos tratando de hacer debe crear un proyecto que contiene los recursos que necesita para la prueba y que sea una prueba de ámbito de la dependencia tanto mi-mi-lógica y la aplicación de web

Cuestiones relacionadas