Comment désactiver Autowiring Spring dans les tests unitaires pour l'utilisation de @ Configuration / @ Bean
Je veux configurer un composant de test à l'aide de printemps-tester la configuration intérieure de la classe (@Configuration
). Des composants testés a certains services qui j'aimerais maquette pour le test. Ces services sont des classes (pas d'interface utilisée) et ont du printemps des annotations ( @Autowired
). Mockito peut facilement se moquer d'eux, cependant, je n'ai trouvé aucun moyen de la désactivation de printemps permettra à l'autowiring.
Exemple comment je peux reproduire facilement:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SomeTest.Beans.class)
public class SomeTest {
//configured in component-config.xml, using ThirdPartyService
@Autowired
private TestedBean entryPoint;
@Test
public void test() {
}
@Configuration
@ImportResource("/spring/component-config.xml")
static class Beans {
@Bean
ThirdPartyService createThirdPartyService() {
return mock(ThirdPartyService.class);
}
}
}
public class ThirdPartyService {
@Autowired
Foo bar;
}
public class TestedBean {
@Autowired
private ThirdPartyService service;
}
Dans cet exemple "TestBean" représente le service se moque de lui. Je ne voudrais PAS "bar" pour être injecté par le printemps! @Bean(autowire = NO)
n'aide pas (en fait, c'est la valeur par défaut).
(Merci de me sauver de "l'usage des interfaces de!" commente - la moqué de service peut être 3ème partie qui je ne peux rien faire avec.)
Mise à JOUR
Springockito résout partiellement le problème, tant que vous n'avez pas à avoir autre chose à configurer (si vous ne pouvez pas utiliser la configuration de la classe avec Springockito - il ne le supporte pas), mais l'utilisation se moque seulement.
Toujours à la recherche de source pure solution, si il y a de tout...
source d'informationauteur vuk
Vous devez vous connecter pour publier un commentaire.
Voici ma solution à votre problème:
et puis juste
dans votre test
@Configuration
et vous êtes tous ensembleJe l'ai résolu par la création de l'interface factorybean pour mon haricot au lieu de simplement se moquant de haricot. Lors de cette façon, le Printemps n'essayez pas de autowire champs.
Usine bean aider la classe:
Test réel contexte de la partie:
Vérifier Le printemps des profils. Vous n'avez pas besoin de désactiver le câblage, vous devez injecter différentes fèves pour une configuration différente.
Vous pouvez ajouter la moqué de service manuellement pour le printemps contexte de l'application via org.springframework.les haricots.usine.config.SingletonBeanRegistry#registerSingleton. De cette façon, la maquette n'est pas post-traitées par le ressort et ne cherche pas à autowire la maquette. La maquette elle-même sera injecté dans votre testés bean.
Je suis dans la même situation.
Ce que j'ai trouvé que si vous ne définissez pas le contexte chargeur par @ContextConfiguration annotation sur votre classe de test, le contexte par défaut chargeur doit être utilisé, qui découle de AbstractGenericContextLoader. J'ai eu un coup d'oeil à sa source et s'est avéré, elle enregistre tous les haricots de post-processeurs qui sont responsables de la lecture des annotations telles @Autocâblés. En d'autres termes, l'annotation de la config est activé par défaut.
Ainsi, le principal problème est qu'il y a deux configurations qui sont en conflit: la java config nous dit qui permettra à l'autowiring n'est pas nécessaire, alors que le autocâblés annotation indique le contraire. La vraie question est comment faire pour désactiver l'annotation de traitement afin d'éliminer les indésirables de configuration.
Autant que je sache, il n'existe pas de printemps de la mise en œuvre de ContextLoader qui ne serait pas dérivé de AbstractGenericContextLoader donc je suppose que le seul que nous pouvons faire est d'écrire notre propre. Il serait quelque chose comme ceci:
Bien sûr, il serait utile de passer plus de temps à trouver comment mettre en œuvre ContextLoader correctement.
Acclamations,
Robert
Il y a tellement de façons de le faire, je suis sûr que cette réponse sera incomplète, mais voici quelques options...
Comme actuellement semble être une pratique recommandée, l'utilisation du constructeur d'injection pour vos services plutôt que de permettra à l'autowiring les champs directement. Ce test comme ceci donc beaucoup plus facile.
En faisant cela, vous pouvez également mélanger jusqu'autocâblés et se moque de services par permettra à l'autowiring dans le test lui-même et ensuite de construire les haricots à l'essai avec le plus utile mélange de autocâblés et se moque de haricots.
Une solution raisonnable est d'utiliser le Printemps des profils pour définir stub de services. Ceci est particulièrement utile lorsque vous souhaitez utiliser la même écrasé dispose de plusieurs tests:
À l'aide de la
@Primary
annotation, il assure que ce stub bean sera utilisé à la place de tout autre bean mise en œuvre de laMyService
interface. J'ai tendance à utiliser cette approche pour des choses comme les services de messagerie, et où en changeant de profil, je suis en mesure de basculer entre un vrai serveur de mail et le plus Sage.