2010-08-25 3 views
13

J'ai un module à plusieurs projets de printemps que je mis en place à l'aide Maven:Les ressources de test des dépendances ne sont pas classpath?

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

Mes cours d'essai héritent de AbstractTransactionalJUnit4SpringContextTests et utiliser @ContextCofiguration pour la mise en place du ApplicationContext.

E.g. la classe de test pour un contrôleur de ressort:

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

    @Autowired 
    private ApplicationContext applicationContext; 
    ... 
} 

Comme vous pouvez le voir, il existe un fichier XML de configuration par module. J'ai configs séparées pour le test, résidant dans le test/ressources de chaque module (et additionaly ayant le suffixe "-test"). Tout cela fonctionne (la classe compile, s'exécute et les tests JUnit réussissent) si Je lance le test JUnit dans Eclipse.

Maintenant à mon problème: L'exécution du test en utilisant Maven ne fonctionnera PAS! (par exemple avec "Exécuter en tant que"> "Maven install" sur my-root (j'utilise m2eclipse)). Plus précisément, il va jeter l'exception suivante:

java.io.FileNotFoundException: chemin de classe ressource [applicationContext-logique-test.xml] ne peut pas être ouvert car il n'exist` pas

Il semble que Maven n'ajoute pas les fichiers de my-logic/src/test/resources au chemin de classe configuré lors de l'exécution des tests unitaires de my-webapp.

Comment puis-je résoudre ce problème?

Répondre

13

Il semble que Maven n'ajoute pas les fichiers de my-logic/src/test/resources au chemin de classe qui est configuré lors de l'exécution des tests unitaires de my-webapp.

Non, en effet, ce n'est pas le cas. Premièrement, Maven utilise des dépendances binaires qui sont toujours résolues via le référentiel local. Et deuxièmement, les dépendances binaires n'incluent pas de test.

Mais ce que vous pouvez faire est:

  1. configure le module my-logic pour créer un JAR de test en utilisant jar:test-jar
  2. configure le module my-webapp dépendre de ce JAR (en utilisant un champ test) de test.

Pour le n ° 1, vous devrez configurer le plugin Maven Jar dans le pom.xml 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> 

Et Maven va créer un fichier JAR avec le contenu de target/test-classes pendant package et installer/déployer.

Pour # 2, déclarer une dépendance à l'essai JAR dans le 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> 

Cela devrait le faire.

+0

Merci beaucoup pour cette excellente réponse! J'ai utilisé cette solution et cela fonctionne. Maintenant que vous l'avez expliqué, il est évident pour moi que les ressources de test de toutes les dépendances (externes) ne sont pas incluses dans le classpath. Comment devraient-ils? Mais d'une manière ou d'une autre, ce serait bien que les ressources de mes propres modules soient incluses. Même si je ne sais pas exactement comment cela fonctionnerait, maintenant que j'y pense;) – apropoz

+0

@apropoz De rien. L'idée avec Maven est que les modules sont autonomes: vous pouvez extraire un seul module sans ses frères et le construire. Tout ce qui impliquerait des chemins relatifs romprait cela, ce qui n'est pas souhaitable. –

1

C'est par conception. Les ressources de test ne sont pas placées dans l'artefact de sortie. Par conséquent, les dépendances de test de quelque chose dont vous dépendez ne sont pas accessibles, même dans votre chemin de classe de test unitaire.

Si vous voulez accomplir ce que vous essayez de faire, vous devez créer un projet qui contient les ressources dont vous avez besoin pour tester et faire un test dépendance dans le scope des deux ma logique et mon-webapp

Questions connexes