Hibernate Generic DAO - 测试生成的 SQL 是不是正确
Posted
技术标签:
【中文标题】Hibernate Generic DAO - 测试生成的 SQL 是不是正确【英文标题】:Hibernate Generic DAO - Testing whether the SQL generated is correctHibernate Generic DAO - 测试生成的 SQL 是否正确 【发布时间】:2011-10-19 13:24:29 【问题描述】:我有一个如下的 DAO 基础架构:
StoreDao、CouponDao、PersonDao。
所有这些都从具有大部分功能(使用 Java 泛型)的 GenericDao 扩展而来。 在这里解释一下 - [http://www.ibm.com/developerworks/java/library/j-genericdao/index.html][1]
当在 StoreDao 上调用 getAll() 时,实际调用的是 GenericDao 的 getAll(),它将某些默认 where 子句(如 active=true, expires>now() 附加到要执行的现有 HQL 查询中。
我们有一堆在 setup() 中创建数据的 Dao 测试,还有一堆断言响应的测试。不完全是单元测试,因为数据库没有被模拟,但我猜可以称为集成测试。
我的一个队友创建了一个测试基础设施来测试生成的 sql 查询是否准确。他这样做的方式如下:
有一个自定义的 Hibernate 拦截器,它拦截 onPrepareStatement(),使用 Hibernate 的 ASTParser 创建即将执行的 Query 的 XML 结构,然后使用 XPaths 来验证查询,例如,查看某些字段是否存在于 where子句,连接是正确的等等。
我们这样做是为了单独测试 Generic Dao。为此,我们必须创建 GenericDomain、GenericChildDomain、GenericDomain.hbm.xml 以及支持这些的表。
问题:
这值得吗?除非我们已经为我们已经拥有的所有单元测试完全模拟了数据库,否则我认为我们没有理由创建这个基础设施。
我们怎么能不使用我们已有的基础设施来测试 HQL。如果要确保将 active=true 附加到查询中,只需确保 DAO 不会返回 active=false 的数据。
最后,我们在这里所做的工作是针对特定于休眠的,如果我们决定用 IBatis/JPA-EclipseLink/NoSQL 替换我们的 DAO,这些大部分都会被丢弃。
最后,我们为什么要发明这样的东西。这不是一个相当普遍的问题吗?不是有人已经建立了解决方案吗?
【问题讨论】:
【参考方案1】:在测试生成的 SQL 时,我的投票是“不要这样做”。除非您非常需要以特定方式生成查询——也许是在对性能高度敏感的应用程序中——否则没有真正的需要。大多数情况下,您对在此级别进行测试感兴趣的是,事物会根据它们的映射方式正确保存和加载,并且您的 finder 方法会找到它们应该找到的东西。您似乎倾向于仅启动休眠模式并针对真实数据库执行您的 DAO,我认为这是正确的方法。
【讨论】:
以上是关于Hibernate Generic DAO - 测试生成的 SQL 是不是正确的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate Generic DAO - 测试生成的 SQL 是不是正确
getCurrentSession() 与 openSession()