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的Predicate
、CriteriaBuilder
和Root
。这些不是自定义实现。
您可以查看 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);
- 这应该会为您提供您想要的(或者至少是我刚刚写的代码片段)。
写了一个 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的Predicate
、CriteriaBuilder
和Root
。这些不是自定义实现。
您可以查看 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);
- 这应该会为您提供您想要的(或者至少是我刚刚写的代码片段)。