2015-12-11 7 views
7

Ho un'applicazione per Android in cui utilizzo Realm per mantenere i dati. Ora voglio scrivere un test unitario per questa applicazione, utilizzando Realm.Testing Realm su Android

Tuttavia, non voglio che il test dell'unità interferisca con i miei dati di Reame esistenti. Quindi voglio generare diversi file di Realm per la mia istanza di test. Non mi interessa se hanno un nome diverso, o sono memorizzati in una directory diversa.

Ho provato a utilizzare uno RenamingDelegatingContext, ma senza successo. Secondo https://groups.google.com/forum/#!msg/realm-java/WyHJHLOqK2c/WJFYvglIGk0JgetInstance() utilizza solo il Context per chiamare getFilesDir(), che non sembra sovrascrivere il metodo getFilesDir(), quindi finisco per utilizzare i miei dati in tempo reale per il test.

Successivamente ho provato a utilizzare IsolatedContext, ma IsolatedContext.getFilesDir() restituisce null, quindi anche questo non ha avuto esito positivo.

Infine, ho provato a scrivere una classe che si estende RenamingDelegatingContext, sovrascrivendo getFilesDir(), restituire una directory diversa per Realm da utilizzare. Ho creato la directory utilizzando DeviceMonitor di AndroidStudio, ma quando provo a utilizzare questo contesto, Realm non riesce con uno io.realm.exceptions.RealmIOException: Failed to open . Permission denied. open() failed: Permission denied.

Qualcuno sa se esiste la possibilità di testare il dominio senza influire sui dati in tempo reale?

risposta

8

ero in realtà piuttosto cieca, con la soluzione di essere abbastanza facile da solo utilizzando un nome diverso per la RealmDatabase durante l'installazione del test durante la generazione della sua configurazione. La mia soluzione ora sembra come segue:

RealmConfiguration config = new RealmConfiguration.Builder(getContext()). 
     schemaVersion(1). 
     migration(new CustomMigration()). 
     name("test.realm"). 
     inMemory(). 
     build(); 
Realm.setDefaultConfiguration(config); 
7

Se si utilizza JUnit4 è possibile utilizzare la regola temporaryFolder per generare una cartella di prova: https://garygregory.wordpress.com/2010/01/20/junit-tip-use-rules-to-manage-temporary-files-and-folders/

@Rule 
public TemporaryFolder testFolder = new TemporaryFolder(); 

@Test 
public void testRealm() throws IOException { 
    File tempFolder = testFolder.newFolder("realmdata"); 
    RealmConfiguration config = new RealmConfiguration.Builder(tempFolder).build(); 

    Realm realm = Realm.getInstance(config); 
    // Do test 
    realm.close(); // Important 
} 
+0

Attualmente sto usando JUnit3, quindi questo non mi sembra utilizzabile. Ho risolto il problema utilizzando un file di database diverso con ConfigurationBuilder, ma terrò a mente la soluzione, poiché sembra un po 'meglio perché elimina anche i file temporanei dopo il test –

+1

@Christian Provato sopra codice con Junit4 seguente eccezione sul getInstance(): java.lang.UnsatisfiedLinkError: no regno-JNI in java.library.path \t a java.lang.ClassLoader.loadLibrary (ClassLoader.java:1865) \t a java.lang.Runtime. loadLibrary0 (Runtime.java:870) \t a java.lang.System.loadLibrary (System.java:1122) \t a io.realm.internal.RealmCore.loadLibrary (RealmCore.java:117) – GaneshP

+1

Attualmente Realm non supporta test sulla JVM, è necessario eseguire i test su un dispositivo. –