Unit testing 如何使用hsqdb模拟数据库中断?
我正在使用HSQLDB进行单元测试。Unit testing 如何使用hsqdb模拟数据库中断?,unit-testing,testing,hsqldb,Unit Testing,Testing,Hsqldb,我正在使用HSQLDB进行单元测试。 在使用HSQLDB w/o显式模拟ORM层时,有没有一种好方法可以模拟各种db问题,如约束冲突、ORM层异常或直接db中断?对于中断,您可以尝试不启动db。对于所有其他事情,我更喜欢模拟ORM层 顺便说一句:当使用HSQLDB时,它实际上不再是单元测试了。这更像是一个集成测试。这似乎很难做到,因为内存中的数据库并没有真正变得断开连接或类似。不过,对于您的情况,有几种选择: 若要假装违反约束,请执行破坏约束的操作。例如,对于唯一约束,提前添加一个重复行;对于
在使用HSQLDB w/o显式模拟ORM层时,有没有一种好方法可以模拟各种db问题,如约束冲突、ORM层异常或直接db中断?对于中断,您可以尝试不启动db。对于所有其他事情,我更喜欢模拟ORM层
顺便说一句:当使用HSQLDB时,它实际上不再是单元测试了。这更像是一个集成测试。这似乎很难做到,因为内存中的数据库并没有真正变得断开连接或类似。不过,对于您的情况,有几种选择:
- 若要假装违反约束,请执行破坏约束的操作。例如,对于唯一约束,提前添加一个重复行;对于外键约束,当被测系统不期望时,删除引用的外键行,等等
- ORM层异常很棘手。在这里,对数据库做一些疯狂的操作可能是获得一些反应(例如删除所有表)的最简单方法,但我认为您将很难重现许多可能的问题
- 内存中的数据库并不能直接伪造数据库中断,因为它总是可以访问的。解决方案是进入被测系统和数据库之间的层,并在那里断开连接,这是可能的。我目前正在使用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