2012-09-16 29 views
0

我發現不可能在factoryBean.getObject()被調用之前後處理一個bean。 'endingBean'是一些在開始時初始化的bean的依賴關係,因此它首先被實例化。在'結果結束'在'MyFactoryBean'中構造之前,請參閱我需要'myBeanPostProcessor'來處理'myBean'。 lazy-init和depends-on都沒有幫助。無論如何,'MyFactoryBean.getObject()'總是被首先調用。如何在factoryBean返回一個實例之前處理一個bean?

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

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

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

任何想法如何處理這個?我故意選擇了BeanPostProcessor,因爲這個需求應該處理在junit @Before方法之前設置mocito mocks ......問題是,在@Before方法中設置這些mock太遲了,因爲您需要在上下文時使用它們初始化。

如何做到這一點的方法並不多,包括ExecutionListeners,ContextLoaders,BeanFactoryPostprocessor,Runner等等。

我使用springockito嘲笑我的豆子。

這是否則完美的彈簧測試框架的一個小缺點。

+0

你不能在MyBean的構造函數中進行處理嗎? 還是在setter方法中? – Link19

+0

我不能,myBean實際上是嘲笑的主題。我試圖嘲笑的bean。在調用factoryBean.getObject()時,'myBean'已經在beanFactory中。 – lisak

+0

如果我需要嘲笑任何東西,我傾向於指出並笑。 – Link19

回答

1

我真的不使用這樣的嘲弄(即集成測試)同意,但我明白你的問題。

您需要使用在InitializingBean和BeanPostProcessor之前調用的ApplicationContextAware接口。

但是你的工廠將永遠被稱爲第一所以考慮像配置或重構的新的Java風格不同的選項(因爲它看起來你可能有某種循環依賴)

除了我需要更多的信息。

1

不知道我是否很好地理解了你的問題,但不能簡單地創建另一個上下文文件 - 比如test-override-context.xml並在那裏重新定義bean,最後一個具有相同名稱的bean在上下文中生效。

test-override-context.xml文件:

<import resource="my-base-resource.xml"/> 
<bean id="myBean" class="MyMockedBean"> 
相關問題