0

我有一个 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,它们大部分都会被丢弃。

最后,我们为什么要发明这样的东西。这不是一个相当普遍的问题吗?不是有人已经建立了解决方案吗?

4

1 回答 1

0

在测试生成的 SQL 时,我的投票是“不要这样做”。除非您非常需要以特定方式生成查询——也许是在应用程序的对性能高度敏感的部分——否则没有真正的需要。大多数情况下,您对在此级别进行测试感兴趣的是,事物会根据它们的映射方式正确保存和加载,并且您的 finder 方法会找到它们应该找到的东西。您似乎倾向于仅启动休眠模式并针对真实数据库执行您的 DAO,我认为这是正确的方法。

于 2011-08-04T02:41:21.317 回答