我们的应用程序有一个服务层和一个DAO层,写成Spring bean。
在测试服务层时 - 我不想依赖真正的数据库,所以我通过为DAO层创建'Mock'Impl来嘲笑
因此,当我测试服务层时,我将服务层bean链接到Mock DAO bean 在Production-中,将服务层链接到“真正的”DAO bean
这是个好主意吗? 关于如何模拟数据库层的任何替代建议?
澄清:这个问题是关于测试服务层而不是DAO层。 在测试服务层时 - 我假设DAO层已经过测试或不需要测试。 主要的是 - 我们如何测试服务层 - 而不依赖于DAO实现 - 因此我在嘲笑DAO层
答案 0 :(得分:5)
这是我们多年来一直使用的技术。请注意,在模拟DAO接口时,您有一些选择:
动态模拟框架允许您存根各种情况(无数据,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
。