1

Glassfish v3 で実行される Web アプリケーションがあります。これは JSF v2 と JPA で実現されます (したがって、JTA データ ソースとして宣言されている persistence.xml があります)。

JUnit でリポジトリをテストしようとすると、ルックアップに失敗し、次のエラーが表示されます。

javax.naming.NamingException: Lookup failed for 'java:comp/env/persistence/em' in SerialContext[myEnv=
java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory,
java.naming.factory.url.pkgs=com.sun.enterprise.naming, 
java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} 
[Root exception is javax.naming.NamingException: Invocation exception: Got null ComponentInvocation ]

Glassfish の transaction-type="JTA" と競合するため、提供できない transaction-type="RESOURCE_LOCAL" を要求しているようです。

それで、私が聞きたいのは、Web アプリケーションの構成を [強く] 変更せずに JUnit を実行する方法を見つけることができるかどうかということです。ありがとう、AN

4

1 に答える 1

1

実際のコンテナ内テストについては、Arquillianを参照してください。コンテナ内で単体テストを実行できます。

http://arquillian.org/guides/のドキュメントと、 https://github.com/arquillian/arquillian-showcase/の GitHub のショーケースをご覧ください。JSF関連のショーケースもあります。

あなたの構成について。本番環境とは異なる構成を使用できるように、プロジェクトを構成することを強くお勧めします。

テスト用に動作する JPA 環境のみが必要な場合は、次の手順を実行する必要があります。

  • で 2 番目の JPA 構成を作成しますtransaction-type="RESOURCE_LOCAL"
  • エンティティ マネージャーのセッターを Bean に追加します。
  • スタンドアロン Java アプリケーションで行う場合と同様に、テスト セットアップ内でエンティティ マネージャーを作成します。
  • Bean にエンティティーマネージャーを手動で注入します。
  • Mockitoのようなモック フレームワークを使用して、現在のテストの一部ではないがテストに必要なアプリケーションの他のすべての部分をモックするようにしてください。

2 番目のアプローチは、アーキテクチャとそれが提供する可能性によって異なります。これにより、非常にきめ細かい単体テストを作成できます。最初のアプローチは、コンテナー内のアプリケーションの実際の動作をテストするのに非常に役立ちます。

于 2012-06-27T07:41:57.307 に答える