【问题标题】:SQL server stub for java用于 Java 的 SQL 服务器存根
【发布时间】:2011-06-26 18:34:40
【问题描述】:

我有一个通过 JDBC 驱动程序使用 MSSQL 服务器的 Java 应用程序。是否有某种存根可用于测试?例如,我想测试我的应用程序如何处理连接错误、SQL Server 磁盘不足和其他异常的情况。用真实的 SQL Server 模拟这个非常困难和复杂。

谢谢

【问题讨论】:

  • 您好,在这个问题上设置赏金,希望得到更多的回复。正如我在下面评论的那样,我想要一种在外部作为黑盒测试我的应用程序的方法,而不是在内部使用单元测试。那里有存根 SQL 服务器吗?或者什么是最简单的创建方法?提前致谢!

标签: java sql-server jdbc stub


【解决方案1】:

您可以使用 https://mocquer.dev.java.net/ 等模拟库针对您的 DAOs 或返回模拟 Connection 对象的存储库编写单元测试。

您需要一个真正干净且解耦的应用程序架构,以使其正常工作并为您提供实际的测试覆盖率。

【讨论】:

  • A 不要模拟单元测试,而是对我的应用程序进行完整的功能测试。理想情况下,它将是某种我可以控制的存根,或者“告诉”它如何表现(例如 - 在 3 次插入 DB 之后,开始抛出磁盘空间异常)。
  • @cherouvim - 看起来 mocquer 移动或死了。链接已失效,不在java.net/projects/community 的索引中,我在其他地方也找不到。你知道它去哪儿了吗?
  • @Ed Staub:是的,这很可悲。 java.net 一直是一个蹩脚的网站,现在由 oracle 运行它是“FUBAR”。我只需拿起罐子并开始工作:google.com/search?q=mocquer+jar 或寻找另一个模拟库。
【解决方案2】:

您可以(假设系统的架构使这变得容易)创建您自己的 DB Access 类版本(我假设您使用的是语句/preparedstatement 接口),它将保存真正的 DB 调用,并且你可以修改做你想要的。

我已经完成了 - 这需要一天左右的时间非常无聊的工作。

【讨论】:

    【解决方案3】:

    我不认为有这样的事情。
    您最好建立自己的数据库并在您的机器/局域网上进行测试。

    我所知道的只有:

    两者都支持 MySQL,但不支持 MS-SQL。我确实认为这与许可问题和限制有关。所以恐怕你不会为 MS-SQL db 找到类似的服务。

    【讨论】:

      【解决方案4】:

      用我想到的选项回答自己,我很高兴听到您对此的意见。 爬了一圈之后,我到了HyperSQLDB,一个java实现的数据库。 你觉得有多大的可行性是把HSQLDB的源代码拿来,再给它加一层,这样我就可以控制它,给它注入预定义的行为。 例如,我会让它缓慢地运行所有查询,我会让它断开连接等等。

      你认为这个想法值得追求吗?在合理的时间内是否可行?

      【讨论】:

        【解决方案5】:

        如果您使用 MS-SQL 以外的其他东西,由于不兼容和缺乏功能(例如事务),您可能会导致比您解决的更多的测试问题。所以我和卡尔在一起 - 使用垫片。

        如果您正在寻找普通行为的单元测试覆盖率,我可能会有不同的想法。

        我没有亲自使用过它们,但是您所说的内容听起来非常适合模拟框架,例如 Mockito(docs) 或 PowerMock。它们似乎为您所追求的那种故障注入提供了良好的支持。有经验的人可以参与其中吗(或类似的)?另见How to stub/mock JDBC ResultSet to work both with Java 5 and 6?

        【讨论】:

          【解决方案6】:

          执行过程sp_who2 它将在您的数据库中生成所有当前连接和进程,您可以看到一个名为 spid 的列对应于每个数据库连接。只需键入:kill <<spid>> 并执行它以终止任何用户..等。但如果 spid 小于 50,则意味着它是一个系统进程,不要杀死它。这可以帮助您复制连接断开。 你也可以说ALTER DATABASE dbname SET SINGLE_USER WITH ROLLBACK_IMMEDIATE 这将立即断开与该数据库的所有连接。

          Select @@MAX_Connections as Max_Connections 将为您提供可以与数据库建立的最大连接数(您可以将其设置为较低的数字以测试连接不可用)。

          复制查询超时。将查询超时设置为非常低的数字并执行相当大的查询。

          要创建磁盘空间错误,只需减小 db 文件的大小并不允许其增长...然后将数据插入数据库(您会遇到异常)。

          altert database xxx (file= maxsize= filegrowth=)

          【讨论】:

          • 如何实现自动化?我需要编写自动化测试,而不是每次都手动运行这个序列。
          • 这些是简单的查询...您可以在程序运行时执行它们并获得所需的结果..这可以通过不时清除所有连接的程序本身来完成.. . 等等。只需编写一个线程,在特定持续时间后唤醒并运行这些查询......
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多