私は、多くの複雑なHibernate基準のクエリを持つJavaアプリケーションを開発しています。私は、これらの基準をテストして、彼らが正しいものを選択していることを確認したいと思います。これに対する1つのアプローチは、もちろん、メモリ内データベース(例えばHSQL)をセットアップし、各テストにおいて基準を使用してそのデータベースを往復させ、クエリ結果が私の予想と一致することをアサートすることである。データベースを使用せずにHibernate criteriaクエリをテストするには?
しかし、私は単純な解決策を探しています.Hibernateの基準は、Javaオブジェクトに関する特殊な論理的述語に過ぎないからです。したがって、理論上は、データベースに全くアクセスせずにテストすることができます。例えば、実体があると仮定すると、Cat
呼ば:
class Cat {
Cat(String name, Integer age){
this.name = name;
this.age = age;
}
...
}
私は基準のクエリを作成するには、このような何かをしたいと思います:
InMemoryCriteria criteria = InMemoryCriteria.forClass(Cat.class)
.add(Restrictions.like("name", "Fritz%"))
.add(Restrictions.or(
Restrictions.eq("age", new Integer(0)),
Restrictions.isNull("age")))
assertTrue(criteria.apply(new Cat("Foo", 0)))
assertTrue(criteria.apply(new Cat("Fritz Lang", 12)))
assertFalse(criteria.apply(new Cat("Foo", 12)))
基準は、このような生産コードで使用することができ:
criteria.getExecutableCriteria(session); //similar to DetachedCriteria
この種のテストを可能にするJavaライブラリはありますか?
ありがとうございます。しかし、あなたが指摘しているように、この種のテストでは、クラスがどのように*実装されているかを検証します。さらに、このテストは別のサービスに集中しています。そのサービスは基準を使用します。これは確かに重要な機能ですが、インタフェースの適切な使用、責任の分離などでクラスをデカップリングすることで、テストするのは比較的簡単です。ここでは、Criteriaオブジェクト自体のテストにもっと興味があります。 –