【问题标题】:Mocking a MySQL server with Java用 Java 模拟 MySQL 服务器
【发布时间】:2011-05-23 13:06:34
【问题描述】:

由于我不是很精通数据库,有些细节可能无关紧要,但我会包括所有内容:

作为我大学的一个项目的一部分,我们正在创建一个使用 JSP、servlet 并使用 MySQL 服务器作为后端的网站。

我负责在 DB 上设置表,并创建 Java 类以与之交互。但是,我们只能从大学内部连接到 MySQL 服务器,而我们所有人(7 人)大部分时间都在家里工作。

我正在创建一个接口QueryHandler,它有一个接受字符串(表示查询)并返回ResultSet 的方法。我的问题是:如何创建一个实现此接口的类,该接口将模拟数据库并允许其他人使用不同的DBHandlers 并且不知道差异并允许我在不连接到实际 MySQL 数据库的情况下测试不同的查询?

编辑:我不太确定 SQL 数据库之间的差异,但显然我在 MySQL 上运行的所有查询都应该在 mock 上运行。

【问题讨论】:

  • 我认为编写这样一个类比让你的每个小组成员在他们的计算机上安装 MySQL 并设置数据库更费力......不过 +1 创意 :)

标签: java mysql sql eclipse


【解决方案1】:

为什么不安装您自己的 MySQL 数据库进行测试?它可以在 Windows、Mac 和 Linux 上运行,而且资源不会太重。我已将它安装在我的笔记本电脑上以进行本地测试。

【讨论】:

  • 不会是单元测试等的问题吗?由于模拟服务器本身不会在我们的主干中(我们使用 SVN)——也就是说,其他人将无法使用它。
  • @amir,每台开发人员的计算机上都应该有 mysql。为开发提供数据库是现实世界中的标准做法。在这种情况下,将数据库放在学生的计算机上。
  • 如果 MySQL 是开发环境的标准部分,并且单元测试 @BeforeClass 确保表和数据设置正确,那么您就是金子。
  • 我从未在团队中与数据库合作过。您能否阐明工作流程 - 每个人如何使用他的数据库版本,如果每个人都有不同的数据库(不同的内容),您如何进行单元测试 - 或者,他们如何同步。
  • 应该有一个脚本可以在源代码控制中创建/更新数据库 - 每个开发人员的数据库都需要在当前结构上。更新脚本或单元测试可确保所需内容存在。
【解决方案2】:

您的 API 似乎存在缺陷。您不应该将结果集返回给客户。通过这样做,您将永远迫使您的客户依赖关系数据库后端。您的数据访问层需要隐藏数据的实际结构和存储方式的所有细节。

考虑返回 List 或允许客户端提供您的数据访问组件可以写入的 Stream,而不是返回 ResultSet。

这将使 API 客户端的单元测试变得微不足道,并允许您随意交换存储机制。

【讨论】:

  • 通常返回什么而不是ResultSet? List 如何提供相同的功能?
【解决方案3】:

试试derby。如果您不介意在返回 SqlServer 时更改驱动程序,它是一个可以用来测试的免费服务器。但是,您可以运行的查询类型可能会受到限制。我不确定 SqlServer 是否有任何标准 SQL 之外的特殊语法。

【讨论】:

    【解决方案4】:

    使用HSQLDB 进行离线测试怎么样?它的行为与 MySQL 数据库不同,但它是一种内存速度很快的 SQL 数据库,应该可以满足您的大部分需求。

    【讨论】:

      【解决方案5】:

      根据我的经验,最好的方法是多个数据库实例和/或架构。通常情况下,每个用户都有一个用于针对正在运行的应用程序进行开发/健全性检查,一个用于运行单元测试的自动构建,理想情况下每个用户都有一个用于运行他们的单元测试。当然还有用于演示、集成测试的实例/模式。除了实用方面,能够做到这一点可确保部署/升级应用程序/数据库也几乎完美无缺。

      假设您有一个 DAO 层,在单元测试级别需要访问真实数据库的唯一代码是 DAO 实现,业务层应该使用模拟 DAO 实现。

      【讨论】:

        猜你喜欢
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-14
        • 2017-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多