【发布时间】:2013-11-26 10:39:21
【问题描述】:
我正在使用带有 Spring Data JPA 1.4.2 的 QueryDSL 3.2.4 作为我的存储库层。我有一个类来获取我的 Web 表单对象(Spring 将搜索表单绑定到的简单 Bean)并为其生成 QueryDSL Criteria 对象,然后将其传递给业务/数据层以运行查询。
我正在尝试找出对这一代 Criteria 对象进行单元测试的最佳方法。根据要搜索的内容,查询中将包含不同的字段组合(基本上,典型的搜索表单,其中字段可以为空白以不基于它进行约束,但每个非空白字段表示一个搜索条件,并且一些字段可能有一些额外的选项,例如它是用于“精确匹配”、“开始于”还是“包含”。)
有一个Spring Data JPA tutorial 提倡使用 QueryDSL 而不是 JPA Criteria API,部分原因是可以通过比较 .toString() 来对 QueryDSL 进行单元测试。所以,这就是我现在倾向于的方式,确保生成的 Criteria 对象的 toString() 对于我正在尝试测试的查询是合理的,但我不确定如何获得“预期" toString 没有提前构建所需的查询并查看它的 toString 是什么,所以感觉不是一个很好的测试,而且感觉它是基于 QueryDSL 的内部结构,可能会发生变化。 (我认为大多数类上的 toString 主要是一种调试辅助工具,而不是规范的一部分,尽管如果有人向我指出关于 QueryDSL 如何创建其 toString() 方法的规范,并且它是使用方式的一部分和/或测试库的使用,我想我会更喜欢这种方法。)我希望有更好的东西。
还有另一个 StackOverflow 问题“How do I unit test the querydsl query inside the given method?”,但这看起来是关于测试整个查询并需要一个模拟 EntityManager。我希望只测试 Criteria 部分,所以我希望有比这更简单的方法,我需要模拟一个使用 Criteria 的查询,然后模拟一个模拟 EntityManager 来使用它,这一切看起来对我来说,这比我为正确创建 Criteria 对象所做的单元测试要复杂得多。
我觉得我不能成为唯一一个试图测试我正在创建正确标准的人。感谢您对我做错了什么或如何更好地进行单元测试的任何见解。
【问题讨论】:
标签: java unit-testing spring-data-jpa querydsl