次のような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 などに置き換えることにした場合、ほとんどが破棄されます。
最後に、なぜこのようなものを発明しなければならないのでしょうか。これはかなり一般的な問題ではありませんか?誰かによってすでに構築されたソリューションはありませんか?