我应该如何对调用MySQL存储过程的Java进行单元测试?

时间:2012-11-14 10:46:49

标签: java mysql unit-testing

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

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

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内挖掘,了解它是如何工作的,然后模拟所有结果。有没有一个测试库可以为我做这一切?我是以错误的方式来到这里的吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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