Доступ к царству из неправильной нити в 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 могут быть доступны только в потоке, который был создан

Итак, как я могу правильно инициализировать свое царство в своих тестах?

Одно из решений, которое я нашел интересным, создает фальшивую область init.

Чтобы манипулировать экземпляром Realm UI-потока из ваших тестов пользовательского интерфейса, вам нужно инициализировать экземпляр Realm в потоке пользовательского интерфейса, используя instrumentation.runOnMainSync(() -> {...}); ,

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

Что я делаю. Я просто добавил следующую функцию в свои AppTools, которые проверяют пакет с тестами:

 fun isTestsSuite() = AppResources.appContext?.classLoader.toString().contains("tests") 

Затем модифицированный init 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) } }