私は実際に SQLiteOpenHelper でデータベースを使用しており、テストのためのトリックがあります。アイデアは、アプリの通常の使用中に標準のオンファイルに保存された DB を使用し、テスト中にインメモリ DB を使用することです。このようにして、標準 DB にデータを挿入/削除/更新することなく、各テストにクリアな DB を使用できます。それは私にとってはうまくいきます。
データベースファイルの名前としてnullを渡すだけで、メモリ内データベースを使用できることに注意してください。これは、API ドキュメントに明確に記載されています。
テスト中にインメモリ DB を使用する利点については、
https ://attakornw.wordpress.com/2012/02/25/using-in-memory-sqlite-database-in-android-tests/ で説明しています。
私のプロジェクトには、SQLiteHelper を拡張する DBHelper クラスがあります。ご覧のとおり、標準的な方法があります。2 つのパラメーターを持つコンストラクターを追加しただけです。違いは、スーパー コンストラクターを呼び出すときに、DB 名として null を渡すことです。
public class DBHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "mydatabase.db";
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public DBHelper(Context context, boolean testMode) {
super(context, null, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
//create statements
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//on upgrade policy
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//on downgrade policy
}
}
プロジェクト内のすべての「モデル」は、抽象クラスである DBModel を拡張します。
public abstract class DBModel {
protected DBHelper dbhelper;
public DBModel(Context context) {
dbhelper = new DBHelper(context);
}
//other declarations and utility function omitted
}
ここで説明したように:コードが JUnit テスト内で実行されているかどうかを確認するにはどうすればよいですか?
スタック トレース要素を検索するだけで、JUnit テストを実行しているかどうかを確認する方法があります。結果として、DBModelコンストラクターを変更しました
public abstract class DBModel {
protected DBHelper dbhelper;
public DBModel(Context context) {
if(isJUnitTest()) {
dbhelper = new DBHelper(context, true);
} else {
dbhelper = new DBHelper(context);
}
}
private boolean isJUnitTest() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
List<StackTraceElement> list = Arrays.asList(stackTrace);
for (StackTraceElement element : list) {
if (element.getClassName().startsWith("junit.")) {
return true;
}
}
return false;
}
//other declarations and utility function omitted
}
ご了承ください
startsWith("junit.")
多分
startsWith("org.junit.")
あなたの場合。