我想为一些连接到数据库的代码编写一些单元测试,运行一个或多个查询,然后处理结果.(没有实际使用数据库)
这里的另一个开发人员编写了我们自己的DataSource,Connection,Statement,PreparedStatement和ResultSet实现,它们将根据xml配置文件返回相应的对象.(我们可以使用伪数据源,只针对它返回的结果集运行测试).
我们在这里重新发明轮子吗?这样的单元测试是否已经存在?是否有其他/更好的方法来测试jdbc代码?
你有几个选择:
用Mock库模拟数据库,例如JMock.这样做的巨大缺点是您的查询和数据很可能根本不会被测试.
使用轻量级数据库进行测试,例如HSQLDB.如果您的查询很简单,这可能是最简单的方法.
为测试专用数据库.DBUnit是一个不错的选择,或者如果你使用的是Maven,你也可以使用sql-maven-plugin来正确设置和拆除数据库(注意测试之间的依赖关系).我建议使用此选项,因为它将使您最有信心查询与数据库供应商正常工作.
有时,使这些测试可配置是必要且有用的,这样只有在数据库可用时才执行这些测试.这可以通过例如构建属性来完成.
您可以将DBUnit与HSQLDB一起使用,HSQLDB可以从CSV文件中读取其初始数据.
我喜欢使用以下组合:
DBUnit的
HSQLDB
Unitils(特别是数据库测试和维护模块)
只需DBUnit和HSQLDB就可以获得相当远的成就.Unitils提供管理和重置数据库状态的最后一英里代码.它还提供了一种管理数据库模式更改的好方法,并且可以轻松使用特定的RBDMS(Oracle,DB2,SQL Server等).最后,Unitils围绕DBUnit提供了一些不错的包装器,它使API现代化并使DBUnit更加愉快.
如果你尚未检查出Unitils,你肯定应该.Unitils经常被忽视和低估.
使用任何Mock框架来完成这样的任务.(JMock的,等等).
一些例子