少し奇妙な問題があります。現在、Embedded GlassFish (3.1.2.2) と共に Arquillian (1.1.0.Final) を使用しています。次のガイドを使用して、小さなテスト プロジェクトをセットアップしました。統合された Derby データベースでは、すべてが正常に機能しました。私の実際のアプリケーションは PostgreSQL をデータベースとして使用するため、GlassFish リソースを次のように構成しました。
<!-- See http://jdbc.postgresql.org/documentation/91/ds-cpds.html -->
<jdbc-connection-pool name="MyPostgresqlPool"
res-type="javax.sql.DataSource"
datasource-classname="org.postgresql.ds.PGSimpleDataSource"
is-isolation-level-guaranteed="false">
<property name="user" value="..." />
<property name="databaseName" value="..." />
<property name="password" value="..." />
<property name="serverName" value="..." />
<property name="portNumber" value="..." />
</jdbc-connection-pool>
そして、上記のガイドで説明されているように、永続化コンテキストとユーザー トランザクションにアクセスします。
@RunWith(Arquillian.class)
public class AddressModuleTest extends BaseTest {
@PersistenceContext
protected EntityManager em;
@Inject
protected UserTransaction utx;
@Before
public void setUp() throws Exception {
utx.begin();
em.joinTransaction();
}
@After
public void tearDown() throws Exception {
utx.rollback();
}
[ ... snip ...]
}
テスト クラス (AddressModuleTest、「BaseTest」には Arquillian の @Deployment アノテーションが付けられた静的メソッドがあることに注意してください) を実行すると、すべて問題なく、PostgreSQL データベースからデータを読み取ることができます。
残念ながら、2 番目のテスト クラスを作成しても機能しません。
@RunWith(Arquillian.class)
public class CommunicationModuleTest extends BaseTest {
@PersistenceContext
protected EntityManager em;
@Inject
protected UserTransaction utx;
@Before
public void setUp() throws Exception {
utx.begin();
em.joinTransaction();
}
@After
public void tearDown() throws Exception {
utx.rollback();
}
[ ... snip ... ]
}
Maven(それぞれ確実)は私に次のエラーを与えます:
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.758 sec <<< FAILURE!
loadMessageDAO(package.CommunicationModuleTest) Time elapsed: 0.027 sec <<< ERROR!
java.lang.RuntimeException: Could not inject members
at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectClass(CDIInjectionEnricher.java:135)
at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.enrich(CDIInjectionEnricher.java:78)
at org.jboss.arquillian.test.impl.TestInstanceEnricher.enrich(TestInstanceEnricher.java:52)
at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ ... snip ... ]
.. 次のルート例外があります。
Caused by: org.jboss.weld.exceptions.IllegalArgumentException: WELD-001324 Argument bean must not be null
at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:678)
at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:136)
at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:686)
at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:695)
at org.jboss.weld.manager.SimpleInjectionTarget$1.proceed(SimpleInjectionTarget.java:106)
at org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:134)
at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:46)
at org.jboss.weld.manager.SimpleInjectionTarget.inject(SimpleInjectionTarget.java:102)
at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectNonContextualInstance(CDIInjectionEnricher.java:145)
at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectClass(CDIInjectionEnricher.java:125)
... 79 more
私はガイドに戻り、彼らのコードで私の問題を再現しようとしましたが、成功しませんでした (つまり、彼らは私の問題の影響を受けていません)。したがって、UserTransaction の処理が間違っているか、PostgreSQL の構成に問題があると思います。つまり、さまざまなデータソースを試しました
org.postgresql.ds.PGSimpleDataSource
org.postgresql.ds.PGPoolingDataSource
同様に成功しませんでしたjavax.xa.XADataSource
。org.postgresql.xa.PGXADataSource
誰かが何が悪いのか手がかりを持っていますか? 私は、トランザクション管理だけでなく、さまざまなデータソースについても (非常に) 経験が浅いことを認めなければなりません。
アップデート
問題は MySQL (MariaDB) でも発生するため、PostgreSQL とは無関係のようです。スタックトレースは同じなので、問題はトランザクション管理にあると思います..
よろしくお願いいたします。ご協力いただきありがとうございます。
愚かな羊