0

factoryBean.getObject()が呼び出される前にBeanを後処理することは不可能です。'resultingBean'は、最初に初期化されるBeanの依存関係であるため、最初にインスタンス化されます。'myFactoryBean'で'resultingBean'が構築される前に、'myBean'で何かを行うには'myBeanPostProcessor'が必要になることを参照してください。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"/>

これに対処する方法はありますか?この要件はjunit@Beforeメソッドの前にモックモックを設定する必要があるため、意図的にBeanPostProcessorを選択しました...問題は、コンテキスト時にそれらを操作する必要があるため、@Beforeメソッドでこれらのモックを設定するのが遅すぎることです。初期化。

ExecutionListeners、ContextLoaders、BeanFactoryPostprocessor、Runnerなど、これを行う方法は多くありません。

私はその場で豆をあざけるspringockitoを使用しています。

これは、他の点では完璧なスプリングテストフレームワークの小さな欠点です。

4

2 に答える 2

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 に答える
1

私はそのようなモックを(つまり統合テストに)使用することに本当に同意しませんが、あなたの問題は理解しています。

InitializingBeanの前に呼び出されるApplicationContextAwareインターフェース、およびBeanPostProcessorを使用する必要があります。

ただし、ファクトリは常に最初に呼び出されるため、新しいJavaスタイルの構成やリファクタリングなどの別のオプションを検討してください(循環的な依存関係があるように見えるため)

私以外にもっと情報が必要です。

于 2012-09-17T02:01:33.613 に答える