2010-02-12 3 views
1

Je n'ai pas écrit de test d'unité ou d'intégration mais maintenant j'essaie. J'ai du mal à mettre en place l'environnement.Configuration de l'unité de ressort/test d'intégration

J'ai mon contexte d'application dans WEB-INF/applicationContext * .xml et dans mon applicationContext.xml, il a une référence à un fichier de propriétés pour DB utilisateur/pass, hôte LDAP, etc

<bean id="propertyConfigurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>/WEB-INF/spring-config/dev.properties</value> 
      </list> 
     </property> 
    </bean> 

J'ai d'autres propriétés pour la configuration log4j (conf conf pour DEV/Staging/Production). ${webapp.root} est défini dans web.xml

<!-- log4j setting --> 
    <bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
     <property name="targetClass" value="org.springframework.util.Log4jConfigurer" /> 
     <property name="targetMethod" value="initLogging" /> 
     <property name="arguments"> 
      <list> 
       <value>${webapp.root}/${log4j.properties.location}</value> 
      </list> 
     </property> 
    </bean> 

Et maintenant, je suis en train de mettre ce qui suit dans une classe de test.

@Override 
protected String[] getConfigLocations() { 
    return new String[]{ 
      "file:trunk/code/web/WEB-INF/applicationContext.xml", 
     }; 
} 

Ceci référence ma xml correctement, mais toutes les propriétés sont foirées.

Je veux savoir ce qui suit:

  • Est-il possible de mettre en place dans la classe de test correctement? Si non, devrais-je déplacer ces classes?
  • Comment puis-je configurer Log4j s'il y a une référence à webroot qui n'existe que dans un conteneur ?!
  • Quelle est la meilleure pratique de Spring config location?

S'il vous plaît Conseiller

Merci

+1

Avez-vous eu du succès? Partagez-le. – Bozho

Répondre

1

Pour unité que vous test ne devriez pas utiliser le contexte d'application Spring. Vous devriez tester tous vos haricots et contrôleurs individuellement car ce sont les unités individuelles du système. Comme ce sont des POJO, il est facile de tout câbler par programmation dans votre code de test. Cela résout également des problèmes tels que l'emplacement du fichier de propriétés de journalisation, car vous pouvez spécifier un chemin différent qui ne dépend pas de la propriété webroot.

Le document testing chapter dans le document Spring Reference fournit un bon aperçu de la manière d'aborder les tests unitaires et d'intégration des applications utilisant Spring. Il fournit également des détails sur les différentes classes de support fournies par Spring pour faciliter l'écriture des tests d'unité et d'intégration.

+1

Si vous ne disposez pas d'un contexte d'application pour vos tests unitaires, vous ne pouvez pas utiliser les différents types de grains injectés dans vos appareils de test. Ne manquez-vous pas un aspect important des tests? Ou devriez-vous faire les deux? – HDave

+1

Je dirais qu'un test où vous n'utilisez pas un contexte d'application est un test unitaire puisque vous testez uniquement cette unité individuelle, peu importe que les beans soient injectés par programmation. Si vous utilisez un contexte d'application, je dirais que c'est plus comme un test d'intégration étant donné que vous testez explicitement comment tout va bien ensemble. – Mark

+1

@HDave Je dirais que vous devriez faire les deux. D'accord avec Mark sur ce qui sépare les tests unitaires et d'intégration. Si vous devez exécuter un contexte, vous n'irez pas aussi loin que vous le pouvez pour obtenir la vitesse de retour que les tests unitaires offrent. En plus de cela, vous ne faites certainement pas TDD. Pas que tu le sois. Juste en disant ... – Crowie

6

This blogpost of mine décrit les étapes de base pour atteindre votre objectif.

Notez que les tests unitaires ne doivent pas savoir que vous avez une racine webapp - ils sont généralement exécutés sans qu'aucun conteneur de servlet ne soit démarré. Placez donc les fichiers de configuration alternatifs dans les paquets de test et essayez.

+0

C'est exactement ce que j'ai fini par faire. Chaque module a des tests unitaires et un fichier 'test-application-context.xml' personnalisé auquel les tests unitaires se réfèrent via l'annotation' @ ContextConfiguration 'de Spring. C'est vraiment génial d'être en mesure de mettre en place un contexte avec tous les appareils de test fictifs dont j'ai besoin pour chaque module Maven dans notre projet. Pour les tests d'intégration, chaque module a un différent 'integrationtest-application-context.xml' qui amène les beans de tous les modules dépendants. – HDave

1

Vous pouvez utiliser des annotations pour référencer la configuration nécessaire à partir des essais, comme ceci:

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({ 
    DependencyInjectionTestExecutionListener.class, 
    DirtiesContextTestExecutionListener.class, 
    TransactionalTestExecutionListener.class }) 
@ContextConfiguration(locations = { 
    "file:../WebService/src/main/resources/application-context.xml", 
    "file:../ServiceLayer/src/test/resources/ServiceLayer-dao-test-context.xml" }) 
public class MyTest { 
    // class body... 
}