我发现在调用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来动态嘲笑我的豆子。
这是完美弹簧测试框架的一个小缺点。
答案 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风格的配置或重构(因为它似乎你可能有类似的循环依赖)
除了我需要更多信息。