Hibernate:如何测试JPA / Hibernate Predicate实例?

时间:2015-07-29 19:59:25

标签: java hibernate jpa hibernate-criteria jpa-2.1

编写了一个Builder类,根据条件生成javax.persistence.criteria.Predicate的实例(使用CriteriaBuilder),我想为这个类写一个JUnit测试...

但是,我不需要测试查询本身(为此我们确实有集成测试),但我想要的是测试Builder生成的Predicate实例。

我正在寻找提示如何在没有挖掘整个API的情况下理想地测试Predicate实例,因为我没有找到toString方法。那将是最简单的方法。 ; - )

假设它只是一个生成Predicate的方法,例如:

public Predicate createPredicate(CriteriaBuilder b, Root<Cat> c, String searchTerm) {

   Predicate predicate = b.like(c.get("name"), searchTerm + "%");
   predicate = b.and(predicate, b.like(c.get("color"), "%" + searchTerm + "%");

   Predicate subPredicate = b.equal(c.get("id"), searchTerm);
   subPredicate = b.or(subPredicate, b.equal(c.get("alternativeId"), searchTerm);

   predicate = b.and(predicate, subPredicate);

   return predicate;

}

当然这个例子没有意义......但它只是一个例子。测试返回值的最佳做法是什么?

实际上Predicate的输出应该是这样的:

name LIKE 'xyz%' 
AND color LIKE '%xyz%'
AND (id = 'xyz' OR alternative_id = 'xyz')

我想以某种方式测试此输出。当然,我可以递归通过Predicate实例,但我希望避免这种情况。

注意:该方法使用的是Hibernate的PredicateCriteriaBuilderRoot。这些都不是自定义实现。

1 个答案:

答案 0 :(得分:1)

您可以查看org.hibernate.ejb.criteria.CriteriaQueryCompiler,为条件查询生成正确的JPQL。

没有查询的单个谓词的编译器没有意义,因为它需要识别正确的实体变量 - 您的示例需要如下所示:

cat1.name LIKE 'xyz%' 
AND cat1.color LIKE '%xyz%'
AND (cat1.id = 'xyz' OR cat1.alternative_id = 'xyz')

要识别cat1,必须考虑整个查询。

但你可以创建自己的CriteriaQueryBuilder.RenderingContext并致电((Renderable) predicate).render(renderingContext); - 它应该为你提供你想要的东西(或者至少是我刚刚写的片段)。