我使用 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 的查询,然后模拟一个 EntityManager 来使用它,所有看起来对我来说,这比我为正确创建 Criteria 对象所做的单元测试要复杂得多。
我觉得我不能成为唯一一个试图测试我正在创建正确标准的人。感谢您对我做错了什么或如何更好地进行单元测试的任何见解。