2010-11-06 73 views
1

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

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

我有一个方法,我试图测试,它给当我的数据库中选择查询正确的输出不返回行:

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

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

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

然后你就可以在new MyDatabaseAdapter()通过在生产代码和模拟类的一个实例在单元测试中。