30

これは少し奇妙な質問ですが、数か月前から気になっています。Wicket + Hibernate(Mavenで構築)を使用してJPAベースのWebアプリケーションを構築しましたが、DAOレイヤーを直接テストしたいと思います。テストに使用した特定のsrc/test / resources / META-INF / persistence.xmlファイルを作成しましたが、WTPなどとの競合が発生しています。これらの問題を回避するために、単体テストを実行する別のテストプロジェクトを作成しました。永続ファイル間に決闘をすることなく、JPAプロジェクトの単体テストを管理するためのより良い方法はありますか?

補遺:他のテストフレームワーク(たとえば、TestNG)はこれを簡単にしますか?

4

5 に答える 5

16

mockitoを試してみてください。テストは次のように機能します。

mockito を使用して「実装」しEntityManagerます。実際のコードの代わりに、mockito のメソッドを使用して、「アプリケーションが を呼び出した場合、getReference()このオブジェクトを返す」と言います。バックグラウンドで、mockito は、Java メソッド呼び出しをインターセプトし、指定した値を返すプロキシ インスタンスを作成します。他のメソッドを呼び出すと、 が返されnullます。

のようなものをcreateQuery()モックするのも同じように機能しますが、最初に のモックアップを作成してから、 (クエリのモックアップを返す)Queryと同じアプローチを使用する必要があります。getReference()

実際の EM を使用しないため、実際の は必要ありませんpersistence.xml

より簡単な解決策は、persistence.xmlファイルの名前を変更するプロパティを設定できる場合ですが、これは可能ではないと思います。

役立つその他のリンク:

于 2009-08-05T19:03:16.107 に答える
5

本番環境とテスト ランタイムに二重のpersistence.xmlファイルを使用していますが、これはクラスパスに関連する問題にすぎません (Eclipse を使用していますが、WTP プラグインにはあまり依存していません)。2 つの唯一の違いは、実稼働バージョンにはエンティティ定義が含まれていないことです。

JPA のテストにモッキング フレームワークは使用していません。テストでは、PostgreSQL データベースと通信する JPA を使用して実際のデータ アクセスを実行します。

テストに対する私たちのアプローチは、永続層の Spring テスト フレームワークであるイントランザクション テストに基づいています。私たちのアプリケーションは Spring ベースですが、このアプローチは、Spring テスト クラスを利用したい任意のアプリケーションにも同様に使用できます。本質は、各テストがコミットされない単一のトランザクション内で実行され、最後に (tearDown で) 自動的にロールバックされることです。これにより、データ汚染とテストの依存性の問題が、控えめで透過的な方法で解決されます。

Spring テスト フレームワークは柔軟で、マルチトランザクション テストを可能にしますが、これらはテストの 10% 以下を構成する特殊なケースです。

私たちはまだJUnit 3.8 のレガシー サポートを使用していますが、JUnit 4 用の新しいSpring TestContext フレームワークは非常に魅力的です。

イントランザクション テスト データを設定するために、ビジネス エンティティを構築する社内ユーティリティ クラスを使用します。すべてのテスト間で共有されるため、維持およびサポートするためのオーバーヘッドは、テスト データをセットアップするための標準的で信頼性の高い方法を持つという利点によって大幅に上回ります。

Spring DI は、テストを簡潔で自己記述的にするのに役立ちますが、重要な機能ではありません。

于 2009-08-05T21:27:05.177 に答える
0

http://www.devx.com/java/Article/36785/1954に記載されているように、プロジェクトから次の行を削除.settings/org.eclipse.wst.common.componentして、Web アプリでテスト リソースをデプロイしないようにすることができます。

<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/test/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/test/resources"/>
于 2011-12-16T11:32:13.920 に答える