Espresso中的错误线程访问Realm

5
每次进行espresso测试之前,我都有一个注释@Before,在其中初始化我的RealmManager.realm
我的object Realm代码片段:
init {
    Realm.init(SaiApplication.context)
    val builder = RealmConfiguration.Builder().schemaVersion(SCHEMA_VERSION)
    builder.migration(runMigrations())
    if (!BuildConfig.DEBUG) builder.encryptionKey(getOrCreateDatabaseKey())
    if (SaiApplication.inMemoryDatabase) builder.inMemory()
    Realm.setDefaultConfiguration(builder.build())
    try {
        errorOccurred = false
        realm = Realm.getDefaultInstance()
    } catch (e: Exception) {
        errorOccurred = true
        realm = Realm.getInstance(RealmConfiguration.Builder()
                .schemaVersion(SCHEMA_VERSION).name(errorDbName).build())
        e.log()
        deleteRealmFile(realm.configuration.realmDirectory)
    }
}

但是当我运行我的测试时,出现了下一个错误:
“来自不正确线程的Realm访问。Realm对象只能在它们被创建的线程上访问。”
那么我应该如何在我的测试中正确初始化我的realm?
我发现其中一个有趣的解决方案是创建一个假的初始化realm。

你应该指定出现异常的那一行代码。 - EpicPandaForce
2个回答

5

要通过UI测试操作UI线程的Realm实例,您需要使用instrumentation.runOnMainSync(() -> {...});在UI线程上初始化Realm实例。

@Before
public void setup() {
    Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
    instrumentation.runOnMainSync(new Runnable() {
        @Override
        public void run() {
           // setup UI thread Realm instance configuration
        }
    });
}

1
我所做的是,在我的AppTools中添加了一个新功能,用于检查包含测试的软件包。
fun isTestsSuite() = AppResources.appContext?.classLoader.toString().contains("tests")

然后修改了Realm的初始化:
 init {
    Realm.init(AppResources.appContext)
    val builder = RealmConfiguration.Builder().schemaVersion(SCHEMA_VERSION)
    builder.migration(runMigrations())
    if (!isTestsSuite()) builder.encryptionKey(getOrCreateDatabaseKey()) else builder.inMemory()
    Realm.setDefaultConfiguration(builder.build())
    try {
        errorOccurred = false
        realm = Realm.getDefaultInstance()
    } catch (e: Exception) {
        errorOccurred = true
        realm = Realm.getInstance(RealmConfiguration.Builder()
                .schemaVersion(SCHEMA_VERSION).name(errorDbName).build())
        e.log()
        deleteRealmFile(realm.configuration.realmDirectory)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接