組み込み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コンテナーにプロパティを導入することをお勧めします。