我有一个通过 JDBC 驱动程序使用 MSSQL 服务器的 java 应用程序。是否有某种存根可用于测试?例如,我想测试我的应用程序如何处理连接错误、SQL Server 磁盘不足和其他异常的情况。用真正的 SQL Server 模拟这个非常困难和复杂。
谢谢
我有一个通过 JDBC 驱动程序使用 MSSQL 服务器的 java 应用程序。是否有某种存根可用于测试?例如,我想测试我的应用程序如何处理连接错误、SQL Server 磁盘不足和其他异常的情况。用真正的 SQL Server 模拟这个非常困难和复杂。
谢谢
您可以使用诸如https://mocquer.dev.java.net/DAO
之类的模拟库针对返回模拟对象的 s 或存储库编写单元测试。Connection
不过,您需要一个真正干净且解耦的应用程序架构才能使其正常工作并为您提供实际的测试覆盖率。
您可以(假设系统的架构使其易于实现)创建您自己的 DB Access 类版本(我假设您使用的是语句/preparedstatement 接口),它将保存真正的 DB 调用并且您可以修改做你想做的事。
我已经做到了——这需要一天左右的非常无聊的工作。
execute procedure sp_who2
it will generate the all the current connections and process in your db you can see a column named spid corresponding to each db connection. just type: kill <<spid>>
and execute it to terminate any users..etc. but if the spid is less than 50 it means it is a system process and dont kill it. This can help you replicate connection drops.
you can also say ALTER DATABASE dbname SET SINGLE_USER WITH ROLLBACK_IMMEDIATE
this will drop all connections to the said db immediately.
Select @@MAX_Connections as Max_Connections
would give you the max connections which can be made to a database (you can set it to a low number to test connection unavailability).
to replicate query timeout.. set the query timeout to a very low number & execute a fairly large query.
to create disk space error, simply redice the size of the db file & do not allow it to grow... then insert data to the database (you'll get an exception).
altert database xxx (file= maxsize= filegrowth=)
如果您使用 MS-SQL 以外的其他东西,由于不兼容和缺少功能(例如事务),您可能会导致比您解决的更多的测试问题。所以我和卡尔在一起 - 使用垫片。
如果您正在寻找普通行为的单元测试覆盖率,我可能会有不同的想法。
我没有亲自使用过它们,但是您所说的内容听起来非常适合模拟框架,例如Mockito ( docs ) 或 PowerMock。它们似乎为您所追求的那种故障注入提供了良好的支持。有经验的人(或类似的)可以权衡吗?另请参阅如何存根/模拟 JDBC ResultSet 以同时使用 Java 5 和 6?
用我想到的选项回答自己,我很高兴听到您对此的意见。在四处搜寻之后,我找到了HyperSQLDB,一个 java 实现的数据库。你觉得有多大的可行性是把HSQLDB的源代码拿来,再给它加一层,这样我就可以控制它,给它注入预定义的行为。例如,我会让它缓慢运行所有查询,我会让它断开连接等等。
你觉得这个想法值得追求吗?在合理的时间内是否可行?