如何为UI测试重新初始化Android Room数据库
我有一个带有房间数据库的Android应用程序。在我的UI测试中,应该在开始时重新初始化房间数据库 由于Room.databaseBuilder具有回调,因此无法在文件室内部删除这些表。回调函数初始化表中的数据如何为UI测试重新初始化Android Room数据库,android,automated-tests,android-room,Android,Automated Tests,Android Room,我有一个带有房间数据库的Android应用程序。在我的UI测试中,应该在开始时重新初始化房间数据库 由于Room.databaseBuilder具有回调,因此无法在文件室内部删除这些表。回调函数初始化表中的数据 instance = Room.databaseBuilder( context, xxxDatabase.class, xxxDatabaseHelper.DB_NAME) .fal
instance = Room.databaseBuilder(
context,
xxxDatabase.class,
xxxDatabaseHelper.DB_NAME)
.fallbackToDestructiveMigration()
.addCallback(new xxxCallback(context)) <-- initialize db data
.build();
例外情况:
(1032) statement aborts at 78: [INSERT OR ABORT INTO `resource_type`(`id`,`name`,`precursor_resource_type_id`,`precursor_unit_type_id`) VALUES (?,?,?,?)] attempt to write a readonly database
04
如何为UI测试重置房间数据库?我学到的一个更好的测试数据库的方法是创建一个ServiceLocator类,如下所示
public class ServiceLocators {
private static ServiceLocators instance;
private static xxDatabase sDatabaseClass;
private ServiceLocators() {
}
public static ServiceLocators getInstance() {
if (instance == null) {
instance = new ServiceLocators();
}
return instance;
}
public static xxDatabase getDatabaseClass(Context context) {
if (sDatabaseClass != null) {
return sDatabaseClass;
} else {
return createDatabase(context);
}
}
public static void setDatabaseClass(xxDatabase databaseClass) {
ServiceLocators.sDatabaseClass = databaseClass;
}
public static void resetRepository() {
sDatabaseClass.clearAllTables();
sDatabaseClass.close();
}
private static xxDatabase createDatabase(Context context) {
return Room.databaseBuilder(
context.getApplicationContext(),
xxDatabase.class,
"database_name.db"
).build();
}
}
ServiceLocators.getInstance().getDatabaseClass(context)
然后在代码中,像这样调用db
public class ServiceLocators {
private static ServiceLocators instance;
private static xxDatabase sDatabaseClass;
private ServiceLocators() {
}
public static ServiceLocators getInstance() {
if (instance == null) {
instance = new ServiceLocators();
}
return instance;
}
public static xxDatabase getDatabaseClass(Context context) {
if (sDatabaseClass != null) {
return sDatabaseClass;
} else {
return createDatabase(context);
}
}
public static void setDatabaseClass(xxDatabase databaseClass) {
ServiceLocators.sDatabaseClass = databaseClass;
}
public static void resetRepository() {
sDatabaseClass.clearAllTables();
sDatabaseClass.close();
}
private static xxDatabase createDatabase(Context context) {
return Room.databaseBuilder(
context.getApplicationContext(),
xxDatabase.class,
"database_name.db"
).build();
}
}
ServiceLocators.getInstance().getDatabaseClass(context)
在测试类中,创建setUp方法,在该方法中只需交换原始数据库的实现
@Before
public void setUp() throws Exception {
xxDatabase database = Room.inMemoryDatabaseBuilder(context, xxDatabase.class)
.allowMainThreadQueries()
.build();
ServiceLocators.setDatabaseClass(database);
}
和拆卸方法来清理数据库表
@After
public void tearDown() throws Exception {
ServiceLocators.resetRepository();
}
您可以改用
Room.inMemoryDatabaseBuilder
吗?数据必须在设备中长期保存。该应用程序完全包含在没有云后端的设备上。哦,糟糕,我以为这是为了你的测试。