2012-09-16 1 views
0

je trouve qu'il est impossible de post-traitement d'un haricot avant factoryBean.getObject() est appelée. 'resultBean' est une dépendance d'un bean initialisé au début, de sorte qu'il est instancié en premier. Voir "MyBeanPostProcessor" pour faire quelque chose avec 'myBean' avant que 'resultBean' soit construit dans 'MyFactoryBean'. Ni aide paresseuse ni dépend-sur. Quoi qu'il arrive, 'MyFactoryBean.getObject()' est toujours appelé en premier.Comment traiter un bean avant factoryBean retourne une instance?

<bean id="myBean" class="example.MyBean" /> 

<bean id="myBeanPostProcessor" class="example.MyBeanPostProcessor" /> 

<bean id="resultingBean" class="example.MyFactoryBean" depends-on="myBean"/> 

Une idée de comment faire face à cela? J'ai choisi BeanPostProcessor exprès parce que cette exigence doit faire face à la mise en place de la méthode se moque mocito précédentes JUnit de @Before ... Le problème est que la mise en place de ces simulacres de méthode @Before est trop tard car vous avez besoin de travailler avec eux au moment de leur contexte initialisation

Il n'y a pas beaucoup de façons de le faire, y compris ExecutionListeners, ContextLoaders, BeanFactoryPostprocessor, Runner et bien d'autres.

J'utilise springockito qui se moque de mes haricots à la volée.

Ceci est un petit inconvénient du cadre d'essai de printemps autrement parfait.

+0

Pouvez-vous pas faire le traitement dans le constructeur de MyBean? ou dans les méthodes setter? – Link19

+0

Je ne peux pas, myBean est en fait le sujet de moqueries. Le haricot j'essaie de me moquer. Lors de l'appel de factoryBean.getObject(), 'myBean' est déjà dans beanFactory. – lisak

+0

J'ai tendance à simplement pointer et rire si j'ai besoin de se moquer de quelque chose. – Link19

Répondre

1

Je ne suis pas vraiment à l'utilisation se moque comme ça (par exemple pour les tests d'intégration) mais je comprends votre problème.

Vous devez utiliser l'interface ApplicationContextAware qui est appelée avant InitializingBean et BeanPostProcessor.

Toutefois, votre usine sera toujours appelée d'abord pour envisager une autre option comme le nouveau style java de configuration ou refactoring (comme il semble que vous pourriez avoir une dépendance cyclique genre)

Autre que je besoin de plus d'informations.

1

Je ne sais pas si j'ai bien compris votre problème, mais vous ne pouvez pas simplement créer un autre fichier contextuel - disons test-override-context.xml et redéfinir les beans, le dernier bean du même nom prend effet dans le contexte.

dans votre fichier test-override-context.xml:

<import resource="my-base-resource.xml"/> 
<bean id="myBean" class="MyMockedBean"> 
Questions connexes