ProviderTestCase
和RenamingDelegatingContext
都會破壞數據庫,如果數據庫在打開它的上下文之前已經存在,那麼從這個意義上說,它們都具有相同的打開SQLite數據庫的低級方法。
您可以通過在您的夾具中打開數據庫setUp()
來利用這一點,這會確保您在每個測試用例之前使用新數據庫。
我建議你去寫內容提供者而不是創建數據庫適配器。您可以使用通用接口訪問數據,將數據存儲在數據庫或網絡中的某處,可以適應內容提供商的設計以訪問此類數據,但代價是IPC的開銷比較大,我們大多數人不應該「不必關心。
如果你這樣做了訪問SQLite數據庫,框架將在一個單獨的進程中爲你完全管理數據庫連接。作爲額外的牛肉,ProviderTestCase2<ContentProvider>
完全引導了您的內容提供者的測試環境,而無需編寫一行代碼。
但是,這並不是說這不是一個巨大的努力來做自我引導。假設你有一個數據庫適配器,我們只專注於open()
用於獲取寫訪問到我們的數據庫,沒有任何幻想:
public class MyAdapter {
private static final String DATABASE_NAME = "my.db";
private static final String DATABASE_TABLE = "table";
private static final int DATABASE_VERSION = 1;
/**
* Database queries
*/
private static final String DATABASE_CREATE_STATEMENT = "some awesome create statement";
private final Context mCtx;
private SQLiteDatabase mDb;
private DatabaseHelper mDbHelper;
private static class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE_STATEMENT);
}
@Override
public void onUpgrade(SQLiteDatabase db, int a, int b) {
// here to enable this code to compile
}
}
/**
* Constructor - takes the provided context to allow for the database to be
* opened/created.
*
* @param context the Context within which to work.
*/
public MyAdapter(Context context) {
mCtx = context;
}
/**
* Open the last.fm database. If it cannot be opened, try to create a new
* instance of the database. If it cannot be created, throw an exception to
* signal the failure.
*
* @return this (self reference, allowing this to be chained in an
* initialization call)
* @throws SQLException if the database could be neither opened or created
*/
public MyAdapter open() throws SQLException {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close() {
mDbHelper.close();
}
}
然後,你可以寫你的測試是這樣:
public final class MyAdapterTests extends AndroidTestCase {
private static final String TEST_FILE_PREFIX = "test_";
private MyAdapter mMyAdapter;
@Override
protected void setUp() throws Exception {
super.setUp();
RenamingDelegatingContext context
= new RenamingDelegatingContext(getContext(), TEST_FILE_PREFIX);
mMyAdapter = new MyAdapter(context);
mMyAdapter.open();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
mMyAdapter.close();
mMyAdapter = null;
}
public void testPreConditions() {
assertNotNull(mMyAdapter);
}
}
所以這裏發生了什麼是上下文中執行RenamingDelegatingContext
,一旦調用MyAdapter(context).open()
,將始終重新創建數據庫。在調用MyAdapter.DATABASE_CREATE_STATEMENT
後,您現在編寫的每個測試都將與數據庫的狀態相對。
[測試Android數據庫JUnit4風格](http://www.singhajit.com/testing-android-database/) – 2015-09-28 17:21:35