0

我发现在调用 factoryBean.getObject() 之前对 bean 进行后处理是不可能的。'resultingBean' 是一些在开始时初始化的 bean 的依赖项,因此它首先被实例化。请参阅在“MyFactoryBean”中构造“resultingBean”之前,我需要“myBeanPostProcessor”来处理“myBean”。lazy-init 和 depends-on 都没有帮助。无论如何,总是首先调用“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来模拟我的豆子。

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

4

2 回答 2

1

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

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

但是总是会首先调用您的工厂,因此请考虑使用不同的选项,例如新的 java 配置或重构风格(因为您可能具有排序循环依赖项)

除了我需要更多信息。

于 2012-09-17T02:01:33.613 回答
1

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

在您的test-override-context.xml文件中:

<import resource="my-base-resource.xml"/>
<bean id="myBean" class="MyMockedBean">
于 2012-09-16T18:53:01.660 回答