9

組み込みEJBコンテナを使用してEJBをテストしようとしています。本番環境では、アプリケーションサーバーで構成されたJTAデータソースに依存しています。ただし、テスト中に、別のDB(メモリ内のDerby)に接続したいと思います。

問題は、本番環境のpersistence.xml(src / main / resources / META-INF)で定義されているJTAデータソースをメモリ内のderbyDBへの接続でオーバーライドするようにEJBコンテナに指示する方法がわからないことです。JTAデータソースは、次のようにpersistence.xmlファイルで定義されます。

<jta-data-source>jdbc/myDS</jta-data-source>

試行1:テストpersistence.xmlを使用する

以下を定義するテストpersistence.xmlファイル(src / test / resources / META-INF内)を作成してみました。

<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:myDataBase;create=true;" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="password" /> 

ただし、テスト対象のモジュールを使用するためにEJBコンテナを指定すると、これは重要ではありません。

Map properties = new HashMap();
properties.put(EJBContainer.MODULES, new File[] { new File("target/classes/") });
ec = EJBContainer.createEJBContainer(properties);

コンテナは、テストファイルの代わりにメインのpersistence.xmlファイルを使用するだけです。

試行2:メインクラスとテストクラスを単一の分解されたモジュールにマージする

このアプローチを機能させるために私が見ることができる唯一の方法は、ここで説明するアプローチを使用することです-テスト対象のモジュールのクラスを別の場所(たとえば、target / ejb-testing-classes)にコピーしてから、testpersistence.xmlをコピーしますファイルを上に置き、次の新しい場所をEJBコンテナに指定します。

Map properties = new HashMap();
properties.put(EJBContainer.MODULES, new File[] { new File("target/ejb-testing-classes/") });
ec = EJBContainer.createEJBContainer(properties);

しかし、これは不必要に不器用に思えます。マージする前にjarを分解する必要があるため、事前にパッケージ化されたモジュール(つまり依存関係)をコンテナーにデプロイしようとすると、将来的にも問題になる可能性があります。

私の願い:EJBコンテナのデータソースオーバーライドプロパティ

EJBコンテナに渡すことができる追加のプロパティがあるかもしれないと思いましたが、これまでのところ、openEJBまたはwebsphereに適したプロパティしか見つけることができません。組み込みGlassfishを使用して、組み込みEJBコンテナを提供しています。これがターゲットプラットフォームです。(私は今、glassfishプロパティを見つけました-以下のアップデート#1を参照してください)

確かに、組み込みEJBコンテナと本番DBとは異なるデータソースを使用してEJBをテストしようとしたすべての人が、この問題に遭遇しました。この男でさえ、この時点で諦め、デフォルトの組み込みDBを使用しましたが、これは私にとってオプションではありません。

どんな助けでも大歓迎です。

更新1: Glassfish EJBコンテナが受け入れるプロパティのリストを見つけました。最初は、次のプロパティを使用できるようです。

org.glassfish.ejb.embedded.glassfish.configuration.file

domain.xmlでデータソースを定義し、コンテナーをそのデータソースにポイントします。ただし、ソースコードによると、installation.rootプロパティも設定されていない限り、このプロパティは無視されます。つまり、テストを実行するためだけに、既存のGlassfishのインストールが必要になります。これは、私のMavenプロジェクトの移植性を容認できないほど低下させます。:(

更新2:この問題に対してJIRAの問題を作成し、JTAデータソースの構成を可能にするGlassfishEJBコンテナーにプロパティを導入することをお勧めします。

4

2 に答える 2

1

埋め込まれたGlassfishでは実行できません。

Update 1で述べたように、組み込みEJBコンテナをデータソースで構成するには、次のことを行う必要があります。

  1. 新しいデータソースを使用してdomain.xmlファイルを構成します
  2. 既存のGlassfishASインストールを使用するように組み込みEJBコンテナを設定します
  3. 手順1のdomain.xmlファイルを使用するように組み込みEJBコンテナを設定します。

それで(ステップ2のおかげで)さようなら、携帯性。しかし、これは、Glassfish開発者がプロ​​パティを介してデータソースを構成するという私の要求に対処するまで、私が従わなければならない「解決策」です(質問の上記のJIRAリンクを参照してください)。

于 2013-03-20T07:31:10.097 に答える
0

私の場合、埋め込みコンテナを直接使用しない場合はかなりうまく機能しますが、そのためにArquillianプロジェクトを使用します。ShrinkWrapヘルパーを使用すると、テストpersistence.xml(およびその他の代替)に合格するように指示できます。

これは非常に短い例を示しています:https ://community.jboss.org/thread/198239

HTH、ティモ

于 2013-02-24T20:51:19.477 に答える