2

「arquillian-glassfish-embedded-3.1」コンテナー (1.0.0.CR3) を使用して、Arquillian (1.0.2.Final) を使用して実行される多くのテスト クラスがあります。

テスト クラスのいずれかを単独で実行すると、期待どおりに実行されます。複数のテスト クラス (TestSuite) を実行しようとすると、EJB をクラスに挿入する際に問題が発生します。

java.lang.RuntimeException: メンバーを注入できませんでした

原因: java.lang.IllegalStateException: リモート ejb-ref name=PackageManagerBean、Remote 3.x インターフェイス =com.dcp.pkg.PackageManager を注入しようとして例外がモジュール test、ejb-link=PackageManagerBean でアプリ内 EJB PackageManagerBean に解決されました,lookup=,mappedName=,jndi-name=PackageManagerBean,refType=クラス com.dcp.transmission.TransmissionManagerBeanTest へのセッション: SerialContext[myEnv={java.naming.factory. initial=com.sun.enterprise.naming.impl.SerialInitContextFactory、java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl、java.naming.factory.url.pkgs=com. sun.enterprise.naming}

原因: com.sun.enterprise.container.common.spi.util.InjectionException: リモート ejb-ref 名 = PackageManagerBean、リモート 3.x インターフェイス = com.dcp.pkg.PackageManager をアプリ内 EJB に解決しようとして例外が発生しましたモジュール test の PackageManagerBean、ejb-link=PackageManagerBean、lookup=、mappedName=、jndi-name=PackageManagerBean、refType=クラス com.dcp.transmission.TransmissionManagerBeanTest へのセッション: SerialContext の 'java:comp/env/PackageManagerBean' の検索に失敗しました[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java. Naming.factory.url.pkgs=com.sun.enterprise.naming}

原因: javax.naming.NamingException: 'java:comp/env/PackageManagerBean' の検索に失敗しました.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [ルート例外は javax.naming.NamingException: Exception 'Remote ejb-ref name=PackageManagerBean,Remote 3.x interface =com.dcp.pkg.PackageManager の解決中の Ejb は、モジュール テストでアプリ内 EJB PackageManagerBean に解決されました,ejb-link=PackageManagerBean,lookup=,mappedName=,jndi- name=PackageManagerBean,refType=Session' . ルックアップに使用される実際の (おそらく内部) リモート JNDI 名は「PackageManagerBean#com.dcp.pkg.PackageManager」です [ルート例外は javax.naming.NamingException:

原因: javax.naming.NamingException: 'Remote ejb-ref name=PackageManagerBean,Remote 3.x interface =com.dcp.pkg.PackageManager の Ejb を解決する例外がモジュール test,ejb-link= でアプリ内 EJB PackageManagerBean に解決されましたPackageManagerBean,lookup=,mappedName=,jndi-name=PackageManagerBean,refType=Session' . ルックアップに使用される実際の (おそらく内部の) リモート JNDI 名は「PackageManagerBean#com.dcp.pkg.PackageManager」です [ルート例外は javax.naming.NamingException です: SerialContext の「PackageManagerBean#com.dcp.pkg.PackageManager」のルックアップに失敗しました[ myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming .factory.url.pkgs=com.sun.enterprise.naming} [ルート例外は javax.naming.

原因: javax.naming.NamingException: Lookup failed for 'PackageManagerBean#com.dcp.pkg.PackageManager' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java .naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [ルート例外は javax.naming.NamingException です: リモート ビジネス インターフェイス com.dcp.pkg.PackageManager の ejb ref 解決エラー [ルート例外は java.lang.IllegalArgumentException: 引数の型が一致しません]]

原因: javax.naming.NamingException: リモート ビジネス インターフェイス com.dcp.pkg.PackageManager の ejb ref 解決エラー [ルート例外は java.lang.IllegalArgumentException: 引数の型が一致しません]

原因: java.lang.IllegalArgumentException: 引数の型が一致しません

パッケージ マネージャー Bean は次のように定義されます。

@Stateless(mappedName = "PackageManagerBean")
@Remote({ PackageManager.class })
@Local({ PackageManagerLocal.class })
public class PackageManagerBean implements PackageManager {

}

パッケージ マネージャーは、以下の例のように、いくつかのテスト クラスに挿入されます。

@RunWith(Arquillian.class)
public class TransmissionManagerBeanTest {

      @Deployment
      public static Archive<?> createDeployment() {
                WebArchive war = ShrinkWrap.create(WebArchive.class, "test.war")
                                    .addPackages(true, TransmissionManager.class.getPackage(), Search.class.getPackage(), PackageManager.class.getPackage(), SiteManagerBean.class.getPackage())
                                    .addAsResource("test-persistence.xml", "META-INF/persistence.xml").addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
                return war;
      }

  @EJB
  TransmissionManager transmissionManager;

  @EJB
  PackageManager packageManager;

  @EJB
  SiteManager siteManager;

  @PersistenceContext
  EntityManager entityManager;

  @Inject
  UserTransaction userTransaction;

}

他の EJB で問題が発生しているようには見えません。

問題の内容と、これを機能させる方法を知っている人はいますか?

4

1 に答える 1

4

私が知る限り、各テスト クラス間で埋め込まれた Glassfish コンテナにデプロイされたリソースをクリーンアップする際の問題のようです。この時点で、問題の原因が Arquillian なのか、埋め込まれた Glassfish コンテナなのか、それとも私のコードなのかはわかりません。

回避策を見つけました。独自の JVM の各テスト クラスで実行することにより、上記の問題を回避します。いくつかの追加のオーバーヘッドが追加されます。たとえば、すべてのテスト クラスに埋め込みコンテナーを再利用する代わりに、コンテナーが取り壊されてテスト クラスごとに再起動されますが、すべての単体テストを一度に実行できます。

Maven を使用してテストを実行し、次の maven-surefire-plugin 構成を使用して、各テスト クラスが独自の JVM で実行されるようにします。

<configuration><forkCount>1</forkCount><reuseForks>false</reuseForks>....</configuration>

2.14 より古いバージョンの maven-surefire-plugin では、 forkMode=false を使用できます

于 2013-04-27T03:14:23.190 に答える