2010-05-16 4 views
8

Un petit fond:Comment remplacer le comportement de Spring @Autowired

J'utilise Spring 2.5, et spécifiquement Spring IOC et les annotations.

J'utilise @Autowired dans mon code (le Autowiring se fait par type) et utiliser @Component pour exposer les classes au câblage automatique.

La situation décrite ci-dessous est survenue pendant que j'essayais de tester mon code.

maintenant au problème:

Note: J'utilise un autre contexte de printemps pour l'environnement de test.

J'ai une classe FOO qui est @Autowired mais dans le contexte de test que je veux utiliser une autre classe du même type MockFoo (étend FOO).

La configuration de Spring échoue automatiquement en raison de plusieurs options pour l'injection de dépendances de la classe FOO (les deux FOO et MockFOO sont conformes à la vérification de type).

Je cherche un moyen d'injecter le haricot de test au lieu du haricot d'origine.

Je m'attendais à ce que Spring autorise l'utilisation du fichier de configuration Context pour remplacer une injection de bean ou pour que Spring n'authise pas un bean spécifique.

MAIS

Toutes ces options semblent existe seulement pour les haricots qui ont été initialement définis dans le contexte du printemps fichier de configuration.

Répondre

6

Utilisez ReflectionTestUtils pour régler manuellement la maquette en place de la dépendance autowired (à cette fin votre maquette ne doit pas être le printemps réussi, de sorte qu'aucune ambiguïté existe)

+0

c'est une bonne solution quand on n'a pas la même instance injectée à plusieurs classes - mais dans un grand projet où un acte de classe en tant que fournisseur de service (c'est un singleton) et est injecté à plusieurs classes, j'espère qu'il y a une solution plus facile/meilleure pour éviter d'injecter chaque classe qui utilise l'original – Mark

2

Je sais que cette question est assez vieux mais je pense une réponse pourrait être utile pour d'autres.

Puisque vous ne voulez probablement pas mélanger Foo et MockFoo dans votre contexte, je suggère d'enlever Foo de l'analyse des composants. Cela peut être fait par exemple en spécifiant include/exclude filters sur le <context:component-scan>. Cependant, si vous implémentez des tests unitaires, je vous suggère de ne pas utiliser un contexte Spring et d'implémenter des tests unitaires «purs» en injectant manuellement des maquettes des dépendances, de sorte que vous ne testez qu'une seule classe. Cela peut être réalisé plus facilement en utilisant un cadre moqueur comme Mockito.

2

Je suis d'accord avec Didier. Voici un exemple de la façon dont vous pouvez exclure les implémentations que vous voulez simuler dans le contexte de votre application de test.

<context:component-scan base-package="com.company" > 
    <context:exclude-filter type="regex" expression="com\.abc\.service\.XDaoImpl"/>  
</context:component-scan> 

Intégrer ce contexte d'application dans votre test comme suit:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:/applicationContext-test.xml"}) 
public class MyTest {....} 
+0

Bonne réponse, j'irais vraiment avec celui-ci. N'oubliez pas que vous pouvez toujours utiliser @Qualifier (name = "someBean") sur votre bean to be injected et @Resource (name = "someBean") sur le champ où vous voulez que cette instance de bean spécifique soit injectée. –

Questions connexes