シーケンサーと次のBeanがあると仮定しましょう。シーケンサーは、データベースシーケンスから次の値を取得する責任があります。OracleSequencerは、本番モードで使用され、JUnit-Testsの間にTestSequencerが使用されます。
public interface Sequencer{
long getNextValue();
}
@Named("OracleSequencer")
public class OracleSequencer implements Sequencer[
...
}
@Named("TestSequencer")
public class TestSequencer implements Sequencer[
...
}
そして、これが私がそれを使いたい方法です:
@Named
public class BusinessBean{
@Inject
private Sequencer sequencer;
}
私の問題は次のとおりです。本番モードでアプリを実行するときに、BusinessBeanにOracleSequencerを注入したいのですが、JUnit - Testを実行するときに、TestSequencerを注入したいと思います。JSR-330(@ Inject、@ Named)で可能ですか?
私は2つの汚い解決策を見つけました:
テストの開始時に、Spring-ApplicationContextから取得したBeanでSequencerを置き換えることができます。プロトタイプが適切であり、TestSequencerに他の依存関係がない場合に可能です。
BusinessBean Bean = springContext.getBean(..); bean.setSequencer(new TestSequencer());
OracleSequencerに@ProductionScopeを使用して注釈を付け、TestSequencerに@TestScopeを使用して注釈を付け、適切な注釈を適切なモードでスキャンするようにSpringを構成できます。
この問題を解決する方法について他に何かアイデアはありますか?
春3.1。