既然在 MockConnection 类里我们不需要任何其他东西,那么我们不需要编写任何初始化代码。当我们以后为其他测试(包括测试代码,就像应用程序代码)使用类的时候我们可能需要添加这些代码。
MockStatement 必须为执行对数据库 SQL 查询提供行为。这意味着它必须返回到一个 ResultSet 对象。ResultSet 对象需要提供测试中的方法所使用的行为。这在上面步骤中的第三步有所体现。因此,让我们创建 MockResultSet 对象。
在我们使用第一个步骤创建默认对象之后,我们需要为 next( )、getInt( )、getString( ) 和 getFloat( )方法提供一个实现。让我们先从 next( )方法入手。Next( ) 只是将指针指向从查询返回的下一行。这意味着在 MockResultSet 里我们需要一个 collection 来实现重复操作。我们可以通过在 MockResultSet 里创建一个私有 Collection 实例来实现,并提供对其进行访问并在其中进行重复操作的方法。我们通过在类中添加下列代码开始。
现在我们需要创建一个 MockResultSet 实例,为其装上我们想要(期待)的从数据库查询返回的记录,并连接使用 MockResultSet 对象的 MockStatement 对象。
第一次测试,我们想确保我们可以返回记录的结果。因此我们将创建一个 MockResultSet 对象,为其装上记录,将它传递给 MockStatement,并将这个 MockStatement 传递给 Connector。我们的测试实例代码看上去像这样:
首先,我们在 MockConnection 中增加一个 setStatement。这只是当调用 createStatement( ) 方法时在要返回的连接中节省一个 Statement (MockStatement)。当执行测试时,我们在 readABC( )方法中的 while 循环一开始处得到一个空指针异常。问题是在 MockStatement 中 executeQuery( )方法并不返回 MockResultSet。让我们改变这一点。
无论我在模拟对象的什么地方改变桩模块来执行适当的活动以支持我们测试,我都按照惯例加入了注释"// MOCK"。现在当我运行测试时,没有成功,因为声明期望我输入的字符串并返回一个空的字符串(不是空值)。我们需要在 MockResultSet 中执行 next( )方法,然后执行从记录中获取数值的方法。next( ) 方法实施看上去像这样:
最后,我们执行缺少的 get...( )方法。下面的代码显示 getInt( )方法看上去如何。getString( ) 和 getFloat( )方法是相似的。