9

我正在编写一个简单的应用程序,它将读取一些记录并将它们插入数据库。我已经编写了一个处理插入逻辑的存储过程,并计划单独测试它。现在我想为获取业务对象并将其传递给存储过程调用的逻辑部分编写一个好的单元测试。

我想要做的是传递数据库连接的模拟,然后断言调用是使用预期的参数值进行的:

Connection dbConnection = makeMockConnection();  // how?
MyObjectWriter writer = new MyObjectWriter(dbConnection);
writer.write(someSampleObject);
// somehow assert that dbConnection called
// `sp_saveMyObject` with param values x, y, and z

然而,似乎有很多工作在里面挖掘java.sql.Connection,了解它是如何工作的,然后模拟所有的结果。是否有一个测试库可以为我完成所有这些工作?我是不是走错路了?

4

3 回答 3

2

您可以使用模拟存储过程创建内存中的 HSSQL 数据库。模拟存储过程会在表中插入一行以显示它已运行以及它的参数是什么。运行被测代码,然后查看数据库以查看发生了什么。

于 2012-11-14T10:55:43.537 回答
0

如果你不关心MyObjectWriter它是如何工作的,那么我会倾向于编写一个集成测试而忘记一个单元测试。

你没有提到你是如何测试存储过程的,所以请原谅我,但我要做的是编写测试,围绕MyObjectWriter它调用数据库上的实际存储过程,然后验证数据库状态。如果可能的话,我会使用内存数据库来缩短测试持续时间。

于 2012-11-14T12:29:24.723 回答
0

您可以使用装饰器设计模式进行连接模拟。您使用您使用的驱动程序创建与数据库的真实连接,该驱动程序由实现 Connection 接口的 ConnectionImpl 类包装,并将真实 Connection 作为成员。
您不想实际执行的每个真实调用,用模拟代码替换它,并且每个调用都保持调用真实连接对象的相同方法(委托调用)。
通过这种方式,您可以像往常一样进行编码,只是返回的对象与创建连接的方法不同。
现在,例如,在模拟对象(您的 ConnectionImpl)中,您可以添加检查输入的单元测试代码。

于 2012-11-14T11:02:52.180 回答