【问题标题】:How to process a bean before factoryBean returns an instance?在 factoryBean 返回实例之前如何处理 bean?
【发布时间】:2012-09-16 17:34:08
【问题描述】:

我发现在调用 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 即时模拟我的 bean。

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

【问题讨论】:

  • MyBean的构造函数中可以不做处理吗?还是在 setter 方法中?
  • 我不行,myBean其实是mock的对象。我试图模拟的 bean。在 factoryBean.getObject() 调用时,'myBean' 已经在 beanFactory 中。
  • 如果我需要嘲笑任何东西,我倾向于只是指指点点然后大笑。

标签: java spring junit mockito springmockito


【解决方案1】:

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

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

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

除了我需要更多信息。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 2023-03-15
      • 2017-02-13
      • 1970-01-01
      相关资源
      最近更新 更多