【发布时间】:2011-02-23 14:05:58
【问题描述】:
我目前被分配为一个项目编写测试,是否有必要为 DAO 类编写测试?
【问题讨论】:
标签: java unit-testing testing
我目前被分配为一个项目编写测试,是否有必要为 DAO 类编写测试?
【问题讨论】:
标签: java unit-testing testing
这取决于:-)
如果您的 DAO 类仅包含从数据库中获取实体所需的代码,则最好在单独的集成测试中对其进行测试*。要进行单元测试的代码是“业务逻辑”,您可以使用模拟 DAO 对其进行单元测试。
[更新]使用EasyMock,您可以轻松地为特定类设置模拟(使用其类扩展,甚至可以模拟具体类),将其配置为从某个方法调用返回特定对象,并将其注入您的类中经过测试。
EasyMock 网站现在似乎已关闭,希望它会很快恢复 - 然后您可以查看文档,恕我直言,该文档非常干净和彻底,其中包含大量代码示例。如果您的问题没有太多细节,我无法给出更具体的答案。 [/更新]
OTOH,如果 DAO 还包含业务逻辑,那么您最好的选择(如果可以的话)是重构它们并将业务逻辑移出 DAO,然后您可以应用以前的策略。
但最重要的是,始终牢记单元测试的座右铭“测试所有可能破坏的东西”。换句话说,我们需要优先考虑我们的任务,并将我们的精力集中在编写以最少的努力提供最大收益的测试上。首先为最关键、最容易出错的代码部分编写单元测试。在您看来,代码非常简单,无法破解,在列表的下方。当然,建议就具体代码向有经验的开发人员咨询 - 他们可能知道并注意到可能存在的陷阱和您不知道的问题。
* 单元测试应该是轻量级、快速且尽可能与环境隔离的。因此,包括对真实数据库调用的测试不是单元测试,而是集成测试。尽管从技术上讲,它们可以使用 JUnit(例如 DbUnit)构建和执行,但它们比真正的单元测试要复杂得多,而且速度要慢几个数量级。有时这使得它们不适合在每次小的代码更改后执行,因为可以(并且通常应该)使用常规单元测试。
【讨论】:
【讨论】:
没有必要为任何事情编写测试。您是否从为您的 DAO 类编写测试中受益?大概吧。
【讨论】:
是的。但是很少有人会争辩说,它不属于单元测试的范畴。因为它不符合每个说的单元测试的定义。我们称之为集成测试,我们测试代码与数据库的集成。
此外,我在这里同意布鲁诺的想法。此外,还有一些 API 可用于执行此操作,其中一个是 DBUnit。
【讨论】:
是的。这样做有几个好处。一旦您确定您的 DAO 层工作正常,后期修复缺陷就变得容易了。
【讨论】:
我认为我们应该为 DAO 编写单元测试,而这样做的最大挑战之一是测试数据的设置和清理。这就是我认为的地方,例如 Spring JDBC 测试框架等框架可以通过让我们使用不同的注释控制事务来帮助我们[示例:@Rollback(true)]。
例如,如果您正在测试“创建/插入”操作,Spring 允许您在测试方法执行后完全回滚事务,从而使数据库始终保持原始状态。
您可以查看此链接了解更多信息:Spring Testing
当您不希望一个测试破坏数据完整性而导致另一个测试失败的集成测试时,这会更加有用。
【讨论】:
xUnit 测试模式这本书为这个问题提供了很多很好的见解。
【讨论】: