Question

J'ai une application volumineuse répartie sur plusieurs fichiers xml de définition du bean Spring. Dans ma suite de tests, je charge manuellement les fichiers XML dont j'ai besoin à l'aide d'un FileSystemXmlApplicationContext pour effectuer les tests que je veux exécuter. Cela réduit le temps de configuration des tests et me permet d’utiliser les mêmes fichiers de configuration que ceux utilisés en production.

Maintenant, j'essaie d'utiliser les classes de base de tests transactionnelles de Spring, qui prennent les emplacements de configuration et chargent le contexte pour moi. Pour une raison quelconque, lorsque le contexte de l'application est créé, Spring ne trouve aucun des fichiers de configuration. Ceci est déroutant parce que je lance le test à partir du même répertoire de travail que lorsque je charge moi-même la configuration à l'aide de FileSystemXmlApplicationContext. Si je préfixe tous mes emplacements de configuration avec le fichier " fichier: " les chemins que je spécifie dans mon test sont trouvés, mais tous les fichiers importés ou référencés par les beans définis dans la configuration (par exemple, les fichiers de propriétés) sont introuvables. Quel est le problème? Puis-je obtenir des tests qui étendent les classes de test de contexte Spring pour qu'ils fonctionnent de la même manière que ceux où je crée le contexte moi-même?

Par exemple, créer le contexte comme ceci fonctionne bien:

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WEB-INF/services-context.xml"})

Si j'étends AbstractTransactionalDataSourceSpringContextTests, les éléments suivants ne trouvent pas services-context.xml:

@Override
protected String[] getConfigLocations() {
   return new String[] { "WEB-INF/services-context.xml"};
}

Ceci trouve le contexte services, mais le PropertyPlaceholderConfigurer défini dans celui-ci ne parvient pas à trouver ses fichiers de propriétés.

 @Override
 protected String[] getConfigLocations() {
    return new String[] { "file:WEB-INF/services-context.xml"};
 }
Était-ce utile?

La solution 2

En plus de redéfinir getConfigLocations, j'ai également redéfini loadContext et utilisé un fichier de confiance fileSystemXmlApplicationContext.

 @Override
 protected String[] getConfigLocations() {
     return new String[] { "WEB-INF/services-config.xml" };
 }

 @Override
 protected ConfigurableApplicationContext loadContext(String[] locations) throws Exception {
     return new FileSystemXmlApplicationContext(locations);
  }

Autres conseils

Nous avons placé tous nos fichiers de configuration et de propriétés Spring dans le chemin de classe, ce qui simplifie les choses. Nous pouvons simplement étendre nos classes de test à partir d'une classe de base telle que:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
        "/spring/*.xml", 
        "/testSpring/*.xml" })
public abstract class AbstractIntegrationTest  {

Ici, les chemins sont tous des chemins dans classpath.

Si vous ne voulez pas faire cela, avez-vous vérifié comment vous référencez les fichiers de propriétés dans votre fichier services-context.xml? Je soupçonne que si vous ajoutez un fichier: à votre configuration de contexte, vous devrez également l'ajouter à votre référence de fichier de propriété. Vous pourriez peut-être simplement utiliser un fichier de configuration Spring différent pour tester la définition de votre espace réservé de propriété et le placer à la fin de la liste des fichiers de contexte. Ses définitions remplaceront celles définies dans les fichiers précédents.

Vos emplacements de configuration sont des URI relatifs et seront interprétés comme tels par la classe de test de base, l’URI étant résolu par rapport à l’emplacement de la classe de test elle-même. Essayez d’utiliser des adresses URI entièrement qualifiées ou d’utiliser une adresse URI relative en tenant compte de la classe de test.

Ne pouvez-vous pas utiliser les fabriques XML de classpath telles que ClassPathXmlApplicationContext ?

Une autre solution possible consiste à dupliquer le services-config.xml , à le renommer en services-config-test.xml et à le placer sous classpath. La même chose vaut pour le fichier de propriétés.

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WebRoot/WEB-INF/services-context.xml"})
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top