2010-05-25 74 views

回答

7

这取决于:-)

如果你的DAO类仅包含获取从DB实体所需的代码,这是更好地测试他们在不同的集成测试*。要进行单元测试的代码是您可以使用模拟DAO进行单元测试的“业务逻辑”。

[更新] E.g.与EasyMock你可以很容易地为特定的类建立一个模拟(使用它的类扩展,甚至可以模拟具体的类),将它配置为从特定的方法调用中返回一个特定的对象,并将它注入到你的类中进行测试。

EasyMock网站似乎现在正在运行,希望它会很快回来 - 然后您可以检查文档,这是恕我直言,相当干净彻底,有很多代码示例。在你的问题中没有太多细节,我不能给出更具体的答案。如果OTOH,DAO也包含业务逻辑,那么你最好的选择 - 如果你能做到这一点 - 将重构它们并将业务逻辑从DAO中移出,那么你可以应用先前的策略。

但底线是,始终牢记单元测试座右铭“测试可能会破坏的所有东西”。换句话说,我们需要优先考虑我们的任务,并集中精力编写能够以最小的努力提供最大收益的测试。首先为最关键的,最具有bug风险的代码部分编写单元测试。在你看来,代码是非常简单的,不可能破坏的是代码。当然,建议您向具有代表性的具体代码咨询经验丰富的开发人员 - 他们可能知道并注意到您可能没有意识到的陷阱和问题。

*单元测试应该是轻量级的,快速和尽可能与环境隔离。因此,包含调用真实数据库的测试不是单元测试,而是集成测试。尽管技术上它们可以用JUnit(和例如DbUnit)来构建和执行,但它们比真正的单元测试要复杂得多,速度要慢几个数量级。有时这会使得它们不适合在每次小代码更改后执行,因为常规单元测试可能(并且通常应该)被使用。

+0

你可以给我快速的例子如何从数据库测试getInstance,你有任何链接显示这个?我想到嘲笑DAO – London 2010-05-25 08:34:02

+0

@伦敦,看到我的更新。 – 2010-05-25 08:46:31

+0

感谢您的广泛解释,我使用jMock其类似于easyMock – London 2010-05-25 08:54:40

4

是的,你应该为DAO编写单元测试。

这些单元测试可以使用内存数据库。例如见:HyperSQL

条关于如何使用的HyperSQL写持久性单元测试中的Java:

http://www.mikebosch.com/?p=8

+0

好主意,确实如此。 – 2010-05-25 08:30:03

+0

这将是一个功能或集成测试 – 2012-09-25 16:58:00

0

这不是必要编写任何测试。 从编写DAO类的测试中受益?大概。

+0

当然我得到的好处:D你有我可以学习的任何链接? tnx – London 2010-05-25 08:41:20

4

是的。但很少有人会认为,它不属于单元测试的范畴。因为它不符合单位测试的定义。我们称之为集成测试,我们测试代码与数据库的集成。

此外,我同意布鲁诺的想法在这里。此外,还有可用的API,一个是DBUnit。

+0

+1:用于使用DbUnit进行自动分贝测试。 – Espen 2010-05-25 08:32:33

+0

+1是的,使用数据库的测试按定义进行集成测试(它们测试DAO和数据库之间的集成)。绝对使用DBUnit(或类似的),我们使用它,它证明非常有帮助。 – sleske 2010-05-25 10:17:56

0

是的。这样做有几个好处。一旦你确定你的DAO层工作正常,后期阶段的缺陷修复就变得容易了。

0

我会争辩说,我们应该为DAO编写单元测试,并且最大的挑战之一就是测试数据的设置和清理。这就是我认为的框架,比如Spring JDBC测试框架可以让我们通过使用不同的注释来控制事务来帮助我们[例子:@Rollback(true)]。例如,如果您正在测试“创建/插入”操作,Spring将允许您在执行测试方法后完成回滚事务,从而始终保持数据库始终处于其原始状态。

你可以看看这个链接获取更多信息:Spring Testing

这可能是更加有用,当你的集成测试,你不希望一个测试来破坏数据的完整性,这可能会导致另一测试失败。

0

本书的xUnit Test Patterns为这个问题提供了很多很好的见解。