我实际上将数据库与 SQLiteOpenHelper 一起使用,并且我有一个测试技巧。这个想法是在应用程序的正常使用期间使用标准的文件存储数据库,在测试期间使用内存中的数据库。通过这种方式,您可以为每个测试使用一个清晰的数据库,而无需在标准数据库中插入/删除/更新数据。这对我来说可以。
请记住,您可以使用内存数据库,只需将 null 作为数据库文件的名称传递。这在 API 文档中有明确记录。
这里解释了在测试期间使用内存数据库的优点:
https ://attakornw.wordpress.com/2012/02/25/using-in-memory-sqlite-database-in-android-tests/
在我的项目中,我有扩展 SQLiteHelper 的 DBHelper 类。如您所见,有标准方法。我只是添加了一个带有两个参数的构造函数。不同之处在于,当我调用超级构造函数时,我将 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.")
在你的情况下。