我在这里有点不知所措。我应该为特定目的编写javax.sql.RowSet
的实现,并且我尽可能地对它进行单元测试。
现在,ResultSet
的光标可以在正常行上(或在第一行之前或之后)或插入行上。 moveToInsertRow()
说:
当光标位于插入行上时,只能调用updater,getter和insertRow方法。
当然应该发生什么事情。 next()
甚至没有指出这种情况,因此不太有帮助:
将光标从当前位置向前移动(sic!)一行。
ResultSet
光标最初位于第一行之前;对方法的第一次调用使得第一行成为当前行;第二个调用使第二行成为当前行,依此类推。当对下一个方法的调用返回
false
时,光标位于最后一行之后。任何需要当前行的ResultSet
方法的调用都将导致SQLException
被抛出。如果结果集类型为TYPE_FORWARD_ONLY
,则由供应商指定其JDBC驱动程序实现是返回false
还是在SQLException
的后续调用中抛出next
。如果输入流为当前行打开,则对方法
next
的调用将隐式关闭它。读取新行时,将清除ResultSet
对象的警告链。返回:
true
如果新的当前行有效;如果没有更多行,则false
抛出:
SQLException
- 如果发生数据库访问错误或在关闭的结果集上调用此方法
我之前没有使用JDBC API的经验,因此不知道是否故意未指定(未定义的行为可能?)或只是疏忽。
目前我认为我只是抛出一个SQLException
即使没有指定,因此UnsupportedOperationException
可能会更好(因为SQLException
表示数据库错误或已关闭{{1} - 这两种情况都不是这样的。)
或者我在某处错过了一些文档?
答案 0 :(得分:1)
我建议您遵循moveToInsertRow()
的合同并抛出某种异常(SQL-
或IllegalState-
)。如果人们错误地拨打next()
,这将导致最小的麻烦。
您还可以查看其他人的实现,看看他们做了什么(例如MySQL Connector / J),这样您使用的其他框架就不会感到惊讶。
答案 1 :(得分:1)
在next()
之后编写一个小程序来实际测试moveToInsertRow()
的行为怎么样?
我是TDDer但有时当我编写使用“外来”API的东西时,我会创建一个小概念证明,它不是真正的测试驱动,通常称为“尖峰”,这样我就可以学习不同的API调用如何交互。 当我觉得自己已经很好地掌握了API时,我就会把尖峰扔掉,然后以正常的TDD方式开始编码。