Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为UI测试重新初始化Android Room数据库_Android_Automated Tests_Android Room - Fatal编程技术网

如何为UI测试重新初始化Android Room数据库

如何为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

我有一个带有房间数据库的Android应用程序。在我的UI测试中,应该在开始时重新初始化房间数据库

由于Room.databaseBuilder具有回调,因此无法在文件室内部删除这些表。回调函数初始化表中的数据

    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
吗?数据必须在设备中长期保存。该应用程序完全包含在没有云后端的设备上。哦,糟糕,我以为这是为了你的测试。