2010-11-06 75 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()通過在生產代碼和模擬類的一個實例在單元測試中。