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

Hibernate: How to test a JPA/Hibernate Predicate instance?

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

但是,我不需要测试查询本身(为此我们有集成测试)但我想要的是测试由 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;

}

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

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

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

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

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

您可以查看 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); - 这应该会为您提供您想要的(或者至少是我刚刚写的代码片段)。