使用模拟数据库连接进行测试的机制

时间:2010-11-06 17:31:52

标签: unit-testing mocking

我的应用程序在其后端有一个数据库,我在如何测试这个东西时遇到了很多麻烦。 (这是一个Android应用程序,但我认为测试概念是相似的。在我的测试应用程序中,我有一个数据库适配器:

public class MyDatabaseAdapter() {
    Cursor returnCursorFromQuery(SQLQuery query) {
         // execute an SQL query and wrap the result in a Cursor object
    }
}

我有一个方法,我正在尝试测试它在我的数据库SELECT查询没有返回任何行时提供正确的输出:

MyDatabaseAdapter adapter;

public int methodUnderTest() {
    this.adapter = new MyDatabaseAdapter();
    return populate();
}

private int populate() {
    SQLQuery query = new SQLQuery("SELECT * FROM my_table");
    Cursor aCursor = this.adapter.returnCursorFromQuery(query);

    // populate the UI

    return aCursor.getCount();
}

我有一个模拟游标对象,对我测试框架中的所有查询返回零行,我不明白的是我如何使用私有populate()方法对模拟游标对象运行查询而不是光标连接到我的实际数据库。或者,如果我编写一个模拟数据库适配器对象,如何让methodUnderTest()使用模拟适配器而不是它编程使用的那个?

任何方向都会非常有用。感谢。

1 个答案:

答案 0 :(得分:1)

您可以MyDatabaseAdapter实现IDatabaseAdapter接口,然后创建一个返回您要测试的模拟MockDatabaseAdapter。然后,而不是在类的构造函数中的this.adapter = new MyDatabaseAdapter(); set MethodUnderTest中设置this.adapter,而不是从IDatabaseAdapter类型的传入参数中设置:

public MyClass(IDatabaseAdapter adapter)
{
     this.adapter = adapter;
}

然后,您可以在生产代码中传递new MyDatabaseAdapter(),并在单元测试中传递模拟类的实例。

相关问题