繁体   English   中英

如何对QueryDSL Criteria生成进行单元测试?

[英]How do I unit test QueryDSL Criteria generation?

我将QueryDSL 3.2.4和Spring Data JPA 1.4.2用作我的存储库层。 我有一个类来获取我的Web表单对象(Spring将搜索表单绑定到的一个简单Bean)并为其生成QueryDSL Criteria对象,然后将该对象传递给业务/数据层以运行查询。

我试图找出最好的方法来对这一代Criteria对象进行单元测试。 根据要搜索的内容,查询中将使用不同的字段组合(基本上是典型的搜索表单,其中的字段可以为空,不以此为基础进行约束,但每个非空白字段均表示搜索条件,有些字段可能还有一些其他选项,例如用于“完全匹配”,“以...开头”还是“包含”。)

有一个Spring Data JPA教程 ,提倡在JPA Criteria API上使用QueryDSL,部分原因是可以通过比较.toString()来对QueryDSL进行单元测试。 因此,这就是我现在倾向于的方式,确保所得的Criteria对象的toString()对于我要测试的查询而言是合理的,但是我不确定如何获得“预期” “ toString,而无需提前构造所需的查询并查看其toString是什么,因此感觉好像不是一个很好的测试,并且感觉它基于QueryDSL的内部结构,该内部结构可能会发生变化。 (我认为大多数类上的toString主要是作为调试工具,而不是规范的一部分,尽管有人指出我关于QueryDSL如何创建其toString()方法的规范,并且这是使用和/的方式的一部分或测试该库的使用情况,我想我会更喜欢这种方法。)我希望有更好的方法。

还有另一个StackOverflow问题“ 如何在给定方法内对querydsl查询进行单元测试? ”,但这似乎是关于测试整个查询并需要模拟EntityManager。 我希望只测试Criteria部分,所以我希望有一种比这更简单的方法,在这种情况下,我需要模拟使用Criteria的Query,然后模拟EntityManager来使用它,并且看起来对我来说,比我要正确创建Criteria对象的单元测试要复杂得多。

我觉得我不可能是唯一要测试我正在创建正确标准的人。 感谢您对我做错事或如何更好地进行单元测试的任何见解。

我使用真实的EntityManager和真实的内存H2数据库 “单元”测试所有QueryDSL代码。 没有对EntityManager的模拟,也没有检查生成的JPQL,我测试查询是否实际上返回了我期望的对象。

单元测试的纯粹主义者可能会认为这不是真正的单元测试,但是我有可以正常工作的代码,而且它足够快。

通过springs 嵌入式数据库支持,这很容易实现:

<jdbc:initialize-database data-source="dataSource">
  <jdbc:script location="classpath:com/foo/sql/db-schema.sql"/>
</jdbc:initialize-database>

我的方法是从简单的查询开始,然后收集越来越复杂的“样本”。 是的,我正在使用实际的查询结果,并将其复制到单元测试的expected部分中。

这不是一个很好的测试。 目的稍有不同:它记录了您的期望。

当某些事情发生变化时,您的测试将开始失败,并且您可以在“我昨天的期望”和“我今天的期望”之间建立区别。

这也记录了您的代码的功能。 当发现生产中的错误时,您可以尝试编写新的单元测试,并查看还有多少其他失败。 这使您对更改的影响有很好的了解(1个更改+ 90%的测试失败?您发现了热点!)

修复错误后,我开始看到通常会出问题的模式,并且可以使用特定的单元测试来保护这些位置(例如在大型查询构建器使用的子构建器中)。

对于一些复杂的查询,我创建了单元测试以查看它们是否真正起作用。 这使我有信心快速进行“字符串比较”单元测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM