我有一个通过JDBC驱动程序使用MSSQL服务器的java应用程序。我可以用某种存根进行测试吗?例如,我想测试我的应用程序如何处理连接错误,SQL服务器磁盘空间和其他异常的情况。使用真正的SQL服务器来模拟它是非常困难和复杂的。
由于
答案 0 :(得分:1)
您可以使用模拟库(例如https://mocquer.dev.java.net/)针对您的DAO
或存储库返回模拟Connection
对象编写单元测试。
为了使这项工作正常并为您提供实际的测试覆盖率,您需要一个非常干净且分离的应用程序架构。
答案 1 :(得分:1)
你可以(假设系统的架构方式使这很容易)创建自己的DB Access类版本(我假设您使用的是teh语句/ preparedstatement接口),这将保留真正的数据库调用,并且您可以修改以完全按照您的要求进行操作。
我做到了这一点 - 需要一天时间才能完成无聊的工作。
答案 2 :(得分:1)
我不认为有类似的东西 您最好设置自己的数据库并在机器/ LAN上进行测试。
我所知道的就是:
两者都支持MySQL,但没有支持MS-SQL。我认为这与许可问题和限制有关。所以我担心你不会为MS-SQL db找到类似的服务。
答案 3 :(得分:0)
用我想到的选项回答自己,我很高兴听到你的意见。 爬行后,我到了HyperSQLDB,这是一个java实现的数据库。 您认为采用HSQLDB的源代码并向其添加另一层是否可行,因此我可以控制它并为其注入预定义的行为。 例如,我会让它慢慢运行所有查询,我会让它断开连接等等。
你认为这个想法值得追求吗?它是否可以在合理的时间内完成?
答案 4 :(得分:0)
如果您使用的不是MS-SQL,则可能会因为不兼容性和缺乏功能(例如,交易)而导致更多测试问题。所以我和卡尔一起 - 使用垫片。
如果您正在寻找普通行为的单元测试覆盖率,我可能会有不同的想法。
我没有亲自使用它们,但是你所谈论的内容听起来非常适合模拟框架,例如Mockito(docs)或PowerMock。它们似乎为您所追求的故障注入提供了良好的支持。有经验的人(或类似人)可以称重吗?另请参阅How to stub/mock JDBC ResultSet to work both with Java 5 and 6?
答案 5 :(得分:0)
执行过程sp_who2
它将在您的数据库中生成所有当前连接和进程,您可以看到对应于每个数据库连接的名为spid的列。只需键入:kill <<spid>>
并执行它以终止任何用户..等等。但如果spid小于50,则意味着它是一个系统进程并且不会杀死它。这可以帮助您复制连接丢弃。
你也可以说ALTER DATABASE dbname SET SINGLE_USER WITH ROLLBACK_IMMEDIATE
这将立即丢弃与所述数据库的所有连接。
Select @@MAX_Connections as Max_Connections
将为您提供可以对数据库进行的最大连接(您可以将其设置为较小的数字以测试连接不可用性)。
复制查询超时..将查询超时设置为一个非常低的数字&amp;执行一个相当大的查询。
创建磁盘空间错误,只需重新编写db文件的大小&amp;不允许它增长...然后将数据插入数据库(你会得到一个例外)。
altert database xxx (file= maxsize= filegrowth=)