我的应用程序在其后端有一个数据库,我在如何测试这个东西时遇到了很多麻烦。 (这是一个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()
使用模拟适配器而不是它编程使用的那个?
任何方向都会非常有用。感谢。
答案 0 :(得分:1)
您可以MyDatabaseAdapter
实现IDatabaseAdapter
接口,然后创建一个返回您要测试的模拟MockDatabaseAdapter
。然后,而不是在类的构造函数中的this.adapter = new MyDatabaseAdapter();
set MethodUnderTest
中设置this.adapter
,而不是从IDatabaseAdapter类型的传入参数中设置:
public MyClass(IDatabaseAdapter adapter)
{
this.adapter = adapter;
}
然后,您可以在生产代码中传递new MyDatabaseAdapter()
,并在单元测试中传递模拟类的实例。