0

次のようなDAOインフラストラクチャがあります。

StoreDao、CouponDao、PersonDao .

これらはすべて、(Java Generics を使用して) 機能の大部分を備えたGenericDaoから拡張されています。ここで説明されている種類 - [http://www.ibm.com/developerworks/java/library/j-genericdao/index.html][1]

getAll() が StoreDao で呼び出されると、実際に呼び出されるのは GenericDao の getAll() であり、active=true、expires>now() などの特定のデフォルトの where 句を実行される既存の HQL クエリに追加します。

setup() でデータを作成する一連の Dao テストがあり、応答でアサートする一連のテストがあります。データベースはモックされていないため、正確には単体テストではありませんが、統合テストと呼ぶことができます。

私のチーム メイトの 1 人が、生成された SQL クエリが正確かどうかをテストするためのテスト インフラストラクチャを作成しました。彼がこれを行う方法は次のとおりです。

onPrepareStatement() をインターセプトするカスタム Hibernate インターセプターを用意し、Hibernate の ASTParser を使用して実行しようとしているクエリの XML 構造を作成し、XPath を使用してクエリを検証します。結合が正しいなど。

これは、Generic Dao を単独でテストするために行っています。このために、GenericDomain、GenericChildDomain、GenericDomain.hbm.xml を、これらをサポートするテーブルと共に作成する必要があります。

質問:

これは価値がありますか?すでに持っているすべての単体テストのデータベースを完全にモックアウトしない限り、このインフラストラクチャを作成する理由はわかりません。

既存のインフラストラクチャで HQL をテストできないわけがありません。active=true がクエリに追加されたことを確認したい場合は、DAO が active=false でデータを返さないことを確認してください。

最後に、ここで行っているのは休止状態に特化したものであり、DAO を IBatis/JPA-EclipseLink/NoSQL などに置き換えることにした場合、ほとんどが破棄されます。

最後に、なぜこのようなものを発明しなければならないのでしょうか。これはかなり一般的な問題ではありませんか?誰かによってすでに構築されたソリューションはありませんか?

4

1 に答える 1

0

生成された SQL のテストに関して、私の投票は「やらない」です。クエリを特定の方法で生成する必要がある場合を除いて (おそらく、パフォーマンスが非常に重要なアプリの一部で)、実際の必要性はありません。このレベルでのテストで最も関心があるのは、物事がどのようにマップされているかに従って適切に保存およびロードされ、ファインダー メソッドが必要なものを見つけることです。あなたは休止状態を起動し、実際のデータベースに対してDAOを実行する方向に傾いているようです.それは正しいアプローチだと思います.

于 2011-08-04T02:41:21.317 に答える