编写了一个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的Predicate
,CriteriaBuilder
和Root
。这些都不是自定义实现。
答案 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);
- 它应该为你提供你想要的东西(或者至少是我刚刚写的片段)。