Java 测试用例:使用Springbeans模拟数据库

Java 测试用例:使用Springbeans模拟数据库,java,unit-testing,spring,junit,mocking,Java,Unit Testing,Spring,Junit,Mocking,我们的应用程序有一个服务层和一个DAO层,编写为Springbeans 在测试服务层时,我不想依赖于一个真实的数据库,所以我通过为DAO层创建一个“Mock”Impl来模拟它 因此,当我测试服务层时,我将服务层bean链接到模拟DAO bean 在生产中,将服务层链接到“真正的”DAOBeans 这是个好主意吗? 关于如何模拟数据库层,还有其他建议吗 澄清:这个问题是关于测试服务层而不是DAO层的。 在测试服务层时,我假设DAO层已经过测试或者不需要测试。 主要的问题是-我们如何测试服务层-而不

我们的应用程序有一个服务层和一个DAO层,编写为Springbeans

在测试服务层时,我不想依赖于一个真实的数据库,所以我通过为DAO层创建一个“Mock”Impl来模拟它

因此,当我测试服务层时,我将服务层bean链接到模拟DAO bean 在生产中,将服务层链接到“真正的”DAOBeans

这是个好主意吗? 关于如何模拟数据库层,还有其他建议吗

澄清:这个问题是关于测试服务层而不是DAO层的。 在测试服务层时,我假设DAO层已经过测试或者不需要测试。
主要的问题是-我们如何测试服务层-而不依赖于DAO实现-因此我模拟DAO层

这是使用模拟测试数据库的一种好方法。我认为没有必要提出任何替代建议;我认为你已经掌握了正确的技术

这是我们已经使用多年的技术。请注意,在模拟DAO接口时,您有一些选择:

  • 将模拟实例创建为真正的Java类
  • 使用动态模拟框架,如(我的首选项)或EasyMock

动态模拟框架允许您剔除各种情况(无数据、1行、多行、异常抛出),而无需创建复杂的类来剔除您希望测试的行为

您肯定走在了正确的道路上


我选择的模拟框架是

,因为我理解这个问题,它明确地致力于测试DAO层的最佳实践,因为在测试服务时模拟数据库似乎不像模拟DAO层那么简单

就我个人而言,我会提出这样一个问题:在经典的单元测试意义上对DAO层进行真正的单元测试是否合理。如果您正确地设计DAO层,它所做的仅仅是将域对象映射到查询

也就是说,我一直建议使用H2、HSQL或Java6EmbeddedDerby之类的嵌入式数据库来做类似的事情,因为模拟数据源实际上比简单地创建嵌入式数据库要费劲得多。Spring3将提供一个很好的构建器模式来动态创建这样的数据库。它的RC1还将引入一个
jdbc
名称空间,以进一步简化设置。有关详细信息,请参阅


但是,即使是现在的Spring2.5分支使用嵌入式数据库,也只需要使用DatabasesJAR并相应地设置一个
数据源。

请参见问题中添加的澄清。谢谢