如何在factoryBean返回实例之前处理bean?

时间:2012-09-16 17:34:08

标签: java spring junit mockito springmockito

我发现在调用factoryBean.getObject()之前无法对bean进行后处理。 'resulBean'是一些在开始时初始化的bean的依赖项,因此它首先被实例化。在'MyFactoryBean'中构造'resulBean'之前,我需要'myBeanPostProcessor'来对'myBean'做一些事情。 lazy-init和依赖都没有帮助。无论如何,总是首先调用'MyFactoryBean.getObject()'。

<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模拟...问题是在@Before方法中设置这些模拟为时已晚,因为你需要在上下文时使用它们初始化。

如何做到这一点的方法并不多,包括ExecutionListeners,ContextLoaders,BeanFactoryPostprocessor,Runner等等。

我正在使用springockito来动态嘲笑我的豆子。

这是完美弹簧测试框架的一个小缺点。

2 个答案:

答案 0 :(得分:1)

不确定我是否理解你的问题,但你不能简单地创建另一个上下文文件 - 比如test-override-context.xml并重新定义那里的bean,具有相同名称的最后一个bean在上下文中生效。

test-override-context.xml文件中:

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

答案 1 :(得分:1)

我真的不同意使用这样的模拟(即集成测试),但我理解你的问题。

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

然而,你的工厂将始终首先被调用,所以考虑一个不同的选项,如新的java风格的配置或重构(因为它似乎你可能有类似的循环依赖)

除了我需要更多信息。