Unit testing 如何使用hsqdb模拟数据库中断?

Unit testing 如何使用hsqdb模拟数据库中断?,unit-testing,testing,hsqldb,Unit Testing,Testing,Hsqldb,我正在使用HSQLDB进行单元测试。 在使用HSQLDB w/o显式模拟ORM层时,有没有一种好方法可以模拟各种db问题,如约束冲突、ORM层异常或直接db中断?对于中断,您可以尝试不启动db。对于所有其他事情,我更喜欢模拟ORM层 顺便说一句:当使用HSQLDB时,它实际上不再是单元测试了。这更像是一个集成测试。这似乎很难做到,因为内存中的数据库并没有真正变得断开连接或类似。不过,对于您的情况,有几种选择: 若要假装违反约束,请执行破坏约束的操作。例如,对于唯一约束,提前添加一个重复行;对于

我正在使用HSQLDB进行单元测试。
在使用HSQLDB w/o显式模拟ORM层时,有没有一种好方法可以模拟各种db问题,如约束冲突、ORM层异常或直接db中断?

对于中断,您可以尝试不启动db。对于所有其他事情,我更喜欢模拟ORM层


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

这似乎很难做到,因为内存中的数据库并没有真正变得断开连接或类似。不过,对于您的情况,有几种选择:

  • 若要假装违反约束,请执行破坏约束的操作。例如,对于唯一约束,提前添加一个重复行;对于外键约束,当被测系统不期望时,删除引用的外键行,等等

  • ORM层异常很棘手。在这里,对数据库做一些疯狂的操作可能是获得一些反应(例如删除所有表)的最简单方法,但我认为您将很难重现许多可能的问题

  • 内存中的数据库并不能直接伪造数据库中断,因为它总是可以访问的。解决方案是进入被测系统和数据库之间的层,并在那里断开连接,这是可能的。我目前正在使用Spring和JDBC模板在一个Java项目上执行此操作,并分别使用以下命令模拟DB超时和中断:

请注意,这两个都将断开新的连接,据我所知,没有办法断开所有当前打开的连接。如果你能得到一个对它的引用,关闭它应该非常接近于模拟中途断开连接

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

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