2010-05-19 5 views
13

J'ai une bibliothèque Java relativement petite qui implémente quelques douzaines de beans (pas de base de données ou d'interface graphique). J'ai créé un fichier de configuration Spring Bean que d'autres projets Java utilisent pour injecter mes beans dans leurs affaires. Je tente maintenant pour la première fois d'utiliser Spring Test pour injecter certains de ces beans dans mes classes de test junit (plutôt que de simplement les instancier). Je le fais en partie pour apprendre Spring Test et en partie pour forcer les tests à utiliser le même fichier de configuration de bean que je fournis pour d'autres. Dans la documentation Spring, il est dit que j'ai besoin de créer un contexte d'application en utilisant la classe "TestContext" qui vient avec Spring. Je crois que cela devrait être fait dans un fichier XML de printemps que je référence via l'annotation @ContextConfiguration sur ma classe de test.Comment créer TestContext pour Spring Test?

@ContextConfiguration({"/test-applicationContext.xml"}) 

Cependant, il n'y a aucun indice quant à ce qu'il faut mettre dans le fichier! Lorsque j'exécute mes tests depuis Eclipse, il est impossible de dire "Impossible de charger le contexte de l'application" .... bien sûr.

Mise à jour:

Voici test applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
    <description>Holds application context for testing of the domain module.</description> 

    <!-- Imports the uuid generator bean definitions --> 
    <import resource="resources/domain-uuid.xml"/> 
</beans> 

Mon répertoire de projet est comme ceci:

domain/ 
    src/ 
     main/ 
     java/ 
     resources/ 
     test/ 
     java/ 
     resources/ (location of test-applicationContext.xml) 

Juste pour le plaisir que j'ai aussi essayé de construire à partir de la ligne de commande mvn via "mvn propre test" et j'ai eu les erreurs suivantes qui peuvent être mon vrai problème:

package org.springframework.test.context does not exist 

package org.springframework.test.context.junit4 does not exist 

cannot find symbol 
symbol: class ContextConfiguration 
@ContextConfiguration({"/resources/test-applicationContext.xml"}) 

cannot find symbol 
symbol: class SpringJUnit4ClassRunner 
@RunWith(SpringJUnit4ClassRunner.class) 

Répondre

10

Que mettre dans le fichier de contexte de l'application. Le TestContext Framework fonctionne de la manière suivante: il vous permet de réutiliser le câblage des applications dans le cadre de vos tests d'intégration. Donc pour la plupart, il n'y a rien de spécial à tester que vous mettriez dans les fichiers de configuration de votre application. Si votre contrôleur a une dépendance de bean de service dans votre application, il l'aura également dans votre test d'intégration. Si votre DAO a une SessionFactory dans votre application, alors même pour votre test d'intégration. De cette façon, vous n'avez plus besoin de tout relier lorsque vous écrivez des tests d'intégration. Très sympa.

J'ai dit pour la plupart ci-dessus parce qu'il y a au moins une exception qui vient à l'esprit. Normalement, votre application utilisera JNDI pour localiser un DataSource, mais dans un test d'intégration (au moins un test d'intégration hors conteneur), vous n'aurez normalement pas d'environnement JNDI disponible. Vous devez donc généralement isoler la création du bean DataSource dans un fichier distinct, et utiliser une version JNDI pour votre application en direct et une version non-JNDI (par exemple, créez simplement un BasicDataSource par exemple) pour votre test d'intégration. Voici un exemple de l'ancien:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myStoreDS" resource-ref="true"/> 

et voici un exemple de ce dernier:

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" 
    p:driverClassName="${dataSource.driverClassName}" 
    p:url="${dataSource.url}" 
    p:username="${dataSource.username}" 
    p:password="${dataSource.password}" /> 

Ces iraient dans des fichiers séparés. Le premier peut aller dans beans-datasource.xml pour une utilisation normale de l'application et le second dans beans-datasource-it.xml pour les tests d'intégration.La configuration qui est commune à l'utilisation normale de l'application et aux tests d'intégration (c'est-à-dire la grande majorité de votre configuration de bean dans la plupart des cas) doit se trouver dans un ou plusieurs fichiers de configuration communs.

En outre, Spring 3 introduit un nouvel espace de noms jdbc qui vous permet de créer une base de données intégrée, comme une base de données HSQLDB ou une base de données Derby, etc. Il ressemble à ceci:

<jdbc:embedded-database id="dataSource"> 
    <jdbc:script location="classpath:hsql/schema.sql" /> 
    <jdbc:script location="classpath:hsql/test-data.sql" /> 
</jdbc:embedded-database> 

qui remplacerait le BasicDataSource configuration décrite ci-dessus, si vous voulez l'utiliser.

Pourquoi l'erreur se produit-elle? L'erreur que vous voyez se produit car votre valeur @ContextConfiguration indique implicitement que le fichier de contexte de l'application doit se trouver sur le chemin de classe. IMPORTANT: Retirez la pièce /resources. Ce sont les entrailles de Maven; quand il construit votre JAR ou WAR, il copie le contenu du répertoire resources dans votre classpath, pas resources lui-même. Cela devrait aider.

EDIT:

Pour répondre à la "aucun symbole trouvé" erreurs, vous devrez ajouter vos dépendances de test à votre POM Maven. Ce sera JUnit et le module Spring Test, tous deux avec <scope>test</scope>. De plus, si vous utilisez un cadre factice comme Mockito, vous devrez ajouter cette dépendance (avec la portée du test) à votre POM. Essayez cela et s'il vous plaît rapportez sur ce qui se passe.

+0

Désolé - Je n'utilise ni JNDI ni DAO. Je ne sais pas où créer le textContext! Vous dites "fichier de contexte de l'application" - qu'est-ce que c'est? – HDave

+0

Le "fichier de contexte d'application" est juste votre fichier XML de configuration Spring. Celui qui a un élément de niveau supérieur. Vous pouvez le mettre directement sous WEB-INF, ou vous pouvez le mettre sur le classpath, comme sous src/test/resource comme vous l'avez dit dans l'un de vos autres commentaires. Il vous sera peut-être utile d'ajouter votre structure de répertoire (les parties pertinentes) à votre message d'origine et de montrer ce que contient votre fichier test-applicationContext.xml. –

+1

OK - Je pense que je comprends. Je n'ai besoin de spécifier TestContext nulle part. Le printemps "sait" en quelque sorte (comment?). Le problème est que Spring ne trouve pas mon fichier de configuration. – HDave

6

Pour le trouver directement sous src/test/ressources, modifiez à:

@ContextConfiguration({"classpath:/test-applicationContext.xml"}) 

Lorsque vous ne spécifiez pas quoi que ce soit, puis la recherche de printemps dans le même package que la classe de test.

Questions connexes