2012-11-15 81 views
1

我正在使用HSQLDB进行单元测试。 有没有一种很好的方法来模拟各种数据库问题,如约束违规,ORM层异常或直接数据库中断,而使用HSQLDB W/O明确模拟ORM层?如何使用hsqdb模拟db中断?

回答

0

对于停电,您可以尝试不启动数据库。对于其他所有我更喜欢嘲笑ORM层的东西。

顺便说一句:当使用HSQLDB时,它实际上不再是单元测试。这更多的是一个集成测试。

0

看来这很难做到,因为内存数据库并不真正变成断开或相似的状态。虽然有几种选择适合您的情况:

  • 要伪造约束违规,请执行一些打破约束条件的操作。例如。对于唯一约束,预先添加重复行,对于外键约束,在被测系统不期望它时删除引用的外部行等。

  • ORM层异常很棘手。在数据库中做野生事物可能是在这里得到一些反应的最简单方法(例如删除所有表),但我认为你会努力重现许多可能的问题。

  • 由于数据库中断数据库实际上总是可以访问,所以DB中断并不是真正的直接伪造。解决的办法是进入被测系统和数据库之间的层,并打破那里的连接,是可能的。目前,我正在做这个使用Spring和JDBC模板的Java项目,以及我与嘲弄DB超时和中断分别为:

 

DriverManagerDataSource dataSource = 
       ((DriverManagerDataSource)jdbcTemplate.getDataSource()); 

// 192.0.2.1 is in the TEST-NET range, guaranteed 
// to never exist, so this always times out 

dataSource.setUrl("jdbc:hsqldb:http://192.0.2.1/testdb"); 

// Subsequent operations then timeout 

// Port 9 is reserved for 'discard', so is almost certainly unconnectable 
// and very very unlikely to ever actually return valid data even if not. 

dataSource.setUrl("jdbc:hsqldb:http://localhost:9/testdb"); 

// Subsequent operations immediately fail to connect 

请注意,这两个将打破新的连接,据我所知,没有办法打破所有当前打开的连接。如果你可以得到一个参考,那么close()应该非常接近于模拟飞行中断线。

此外,正如boutta指出的,这是一个集成测试,而不是单元测试。除了进行这些集成测试之外,您可能还希望单元测试您在此处与DB交谈的代码,并完全为此模拟出您的数据库接口(例如,您的JDBC模板)。这实际上使许多事情变得更容易,特别是模拟特定的异常情况。