2017-06-12 3 views
3

Avant chaque test d'expresso, j'ai une annotation @Before où j'initialise mon RealmManager.realm.Accès au domaine depuis un fil incorrect dans Espresso

extrait de code de mon 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) 
    } 
} 

Mais quand je lance mes tests, je reçois l'erreur suivante:

Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created

Alors, comment je peux correctement initialiser mon royaume dans mes tests?

Un des solutions que j'ai trouvé intéressant, crée un faux royaume d'init.

+0

Vous devez indiquer la ligne où vous obtenez cette exception. – EpicPandaForce

Répondre

0

Ce que je fais. Je viens d'ajouter la fonction suivante dans mes Apptools, qui vérifient ensemble des tests:

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

Alors modifed init Royaume:

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) 
    } 
} 
2

Pour manipuler l'instance de domaine de l'interface utilisateur à partir de vos tests d'interface utilisateur, vous devez initialiser l'instance de domaine sur le thread d'interface utilisateur à l'aide de instrumentation.runOnMainSync(() -> {...});.

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