English 中文(简体)
对一个使用Hibernate驱动的应用进行单元测试?
原标题:
  • 时间:2008-12-30 14:10:10
  •  标签:
Closed. This question needs to be more focused. It is not currently accepting answers.

想改进这个问题吗?通过编辑这篇文章来更新问题,使其专注于一个问题。

Closed 6 years ago.

这可能是一个幼稚的问题,但我对junit和hibernate框架都不熟悉,我想知道测试一个大部分是调用hibernate的应用程序的最佳方法是什么,或者是否有必要这样做?

这里的最佳实践是什么?

EDIT:
Spring seems to be the big suggestion here. Unfortunately this may be alittle too much to bite off for one project. Junit, Hibernate and Spring are all new to me, and while they are all technologies I want to get under my belt, I think trying to incorporate them all into one project may be too overwhelming for me.

教程链接和/或书籍建议都是欢迎的。

问题回答

牢记单元测试和集成测试之间的区别。

单元测试应该测试没有任何外部依赖的代码。这些依赖关系是使用框架(例如JMock)模拟的。

集成测试也很重要,但它们的主要缺点在于运行时间很长。你可以在几秒钟内运行数千个真正的单元测试,但集成测试不是这样的。

根据您的项目/开发团队规模,您可能会优先考虑真正的单元测试而不是集成测试。这两种类型的测试都很重要,但如果资源不足,仅使用单元测试可能是一个更好的选择。

我自己编写了一个应用程序,对Web(在Spring MVC中很容易实现)、服务层和对象领域进行了单元测试。但是,我没有去测试DAO,因为我不想编写一堆缓慢的集成测试。如果我有更多的员工,我也会进行集成测试,但在这种情况下,我认为花费时间不值得。

至于最佳实践:

如果可能,使用嵌入式数据库来运行您的测试,这样您就不需要完全部署关系数据库来运行您的测试(本地或者如果您有连续构建服务器的话)。这样您也不需要(必要地)担心回滚等问题,只需在需要时重新创建数据库即可。使用嵌入式数据库进行测试不会测试出在使用特定的生产数据库时可能出现的特异性,但这样可以测试您的代码,这应该足够了。

您还可以使用DbUnit,这是JUnit的扩展程序,可轻松填充数据库中的预期行并将其置于已知状态,然后再运行Hibernate测试。

最佳实践吗?我使用Spring并使所有测试具有事务性。我执行测试并回滚所有更改,以便我不更改数据库的状态。

我喜欢使用内存中的hsqldb进行测试。每个Hibernate POJO的处理过程是:

  1. Create the object
  2. Persist it to the DB
  3. Clear the session
  4. Get it from the DB
  5. Assert the objects are equal.

对于DAO(数据访问对象),我创建和持久化足够的对象以准确测试方法,然后运行测试并根据需要删除对象,以免干扰其他测试。

Hibernate源代码包含许多单元测试,我建议通过这些测试并采用类似的方法。

您也可以查看为书籍“使用Hibernate进行Java持久化”开发的示例应用程序CaveatEmptor

如果您在使用Hibernate来实现领域模型,则单元测试领域逻辑就像测试一个POJO那样简单,而Hibernate不会妨碍您。这里唯一需要注意的是,在双向映射中,您可能需要在单元测试中在两侧都设置对象。

集成测试与数据库通常不针对简单的映射进行。但是,在像单表继承等精细映射的情况下建议进行测试。记住的唯一一点是,有时您可能需要显式地将其刷新到数据库中。

当然,如果您的持久层不是由Hibernate编写,您会进行单元测试吗?

创建一个使用Hibernate实现的给定持久性接口,实例化一些示例对象,执行CRUD操作,并要求JUnit断言操作是否成功。与任何其他类相同。

你可以使用Spring来帮忙。

它有一个强大的单元测试框架,你可以用它来测试CRUD操作,然后回滚更改——如果你没有每次重新加载数据库的能力,这将非常棒。

编写一个简单的层,将请求传递给Hibernate。然后使用像 EasyMockJMock 这样的模拟库来断言你的Hibernate-表层是否被应用程序类正确调用。这在部分完成的JMock手册中很好地描述了(滚动到测试味道“一切都被模拟”)。

两种情况很容易测试:

  1. 如果可能的话,请在不知道保存或加载实体的函数中执行各种计算和转换。如果您可以使这些函数成为纯函数,则更好。

  2. 对于仅保存到数据库而无需从中读取的功能,请在测试时选择不保存。

完成步骤2的最简单(最粗略)的方法是在函数中添加一个reallyUpdate参数,然后用以下代码包围每个“保存”调用:

if (reallyUpdate) {
    HibernateUtil.saveOrUpdate(theThing);
}

对我来说,这些是最低的果子。





相关问题
热门标签