测试用例:使用Spring bean模拟数据库

时间:2009-06-30 16:40:45

标签: java unit-testing spring junit mocking

我们的应用程序有一个服务层和一个DAO层,写成Spring bean。

在测试服务层时 - 我不想依赖真正的数据库,所以我通过为DAO层创建'Mock'Impl来嘲笑

因此,当我测试服务层时,我将服务层bean链接到Mock DAO bean 在Production-中,将服务层链接到“真正的”DAO bean

这是个好主意吗? 关于如何模拟数据库层的任何替代建议?

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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

这是使用模拟测试数据库的好方法。我认为不需要任何替代建议;我认为你已经拥有了正确的技术!

答案 2 :(得分:1)

你肯定是在正确的轨道上。

我选择的模拟框架是Mockito

答案 3 :(得分:0)

正如我所理解的那样,它明确地专注于测试DAO层的最佳实践,因为模拟数据库似乎并不像在测试服务时模拟DAO层那么简单。

就个人测试意义而言,如果真的对DAO层进行单元测试是合理的,我个人会提出问题。如果你正确地设计你的DAO层,那么除了将域对象映射到查询之外,它没有多大作用。

这就是说我总是建议使用像H2,HSQL或Java 6嵌入式Derby这样的嵌入式数据库来做这样的事情,因为模拟数据源比简单地提高嵌入式数据库要付出更多的努力。 Spring 3将提供一个很好的构建器模式来动态创建这样的数据库。它的RC1还将引入jdbc命名空间以进一步简化设置。有关详细信息,请参阅this one

但即使使用嵌入式数据库的当前Spring 2.5分支也只需要使用数据库JAR并相应地设置DataSource