【问题标题】:Test Cases: Mocking Database using Spring beans测试用例:使用 Spring bean 模拟数据库
【发布时间】:2010-11-07 01:48:46
【问题描述】:

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

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

所以当我测试服务层时,我将服务层 bean 链接到 Mock DAO bean 在生产环境中——将服务层链接到“真正的”DAO bean

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

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

【问题讨论】:

    标签: java unit-testing spring junit mocking


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        你绝对是在正确的轨道上。

        我选择的模拟框架是Mockito

        【讨论】:

          【解决方案4】:

          据我了解,该问题专门针对测试 DAO 层的最佳实践,因为模拟数据库似乎不像在测试服务时模拟 DAO 层那么简单。

          我个人会提出这个问题,如果按照经典单元测试的含义对 DAO 层进行真正的单元测试是否合理。如果你正确地设计你的 DAO 层,它只会将域对象映射到查询。

          也就是说,我总是建议使用 H2、HSQL 或 Java 6 嵌入式 Derby 之类的嵌入式数据库来执行此类操作,因为模拟数据源确实比简单地构建嵌入式数据库要费力得多。 Spring 3 将提供一个很好的构建器模式来动态创建这样的数据库。它的 RC1 还将引入 jdbc 命名空间以进一步简化设置。详情请见this one

          但即使使用嵌入式数据库的当前 Spring 2.5 分支也只是获取数据库 JAR 并相应地设置 DataSource 的问题。

          【讨论】:

          • 请参阅添加到问题中的说明。谢谢
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-21
          • 1970-01-01
          • 2010-09-23
          • 2021-09-18
          • 1970-01-01
          相关资源
          最近更新 更多