0

シーケンサーと次の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。

4

1 に答える 1

1

1つの解決策は、Spring3.1で導入されたSpringプロファイルを使用し、基本的に「prod」および「test」という名前のプロファイルを定義し、プロファイルとプロファイルでOracleSequencer作成できるようにすることです。prodTestSequencertest

テストでは、testプロファイルのみをアクティブ化し、製品はプロファイルをアクティブ化しprodます。

これがプロファイルへの1つの参照です-http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/

提案したような別の解決策は、prodシーケンサーとまったく同じ名前のBeanを指定するか、テストモードでインポートされる新しいアプリケーションコンテキストでBeanを指定することにより、sequencerテスト中のBeanをでオーバーライドすることです。TestSequencer

于 2012-07-04T21:25:31.357 に答える