Тестирование Realm под Android

у меня есть приложение для Android, где я использую Realm для сохранения данных. Теперь я хочу написать модульный тест для этого приложения, используя сферу.

однако я не хочу, чтобы модульный тест вмешивался в мои существующие данные области. Поэтому я хочу создать разные файлы Realm для моего тестового экземпляра. Мне все равно, имеют ли они другое имя или хранятся в другом каталоге.

Я попытался использовать RenamingDelegatingContext, но без успеха. В соответствии с https://groups.google.com/forum#!msg / realm-java/WyHJHLOqK2c / WJFYvglIGk0JgetInstance() использует только Context называть getFilesDir(), который, похоже, не перезаписывает getFilesDir() метод, поэтому я в конечном итоге использую свои живые данные для тестирования.

затем я попытался использовать IsolatedContext, а IsolatedContext.getFilesDir() возвращает null, так что это тоже не увенчалась успехом.

наконец, я попытался написать расширение класса RenamingDelegatingContext поверх getFilesDir(), верните другой каталог для Realm в использовать. Я создал каталог с помощью DeviceMonitor AndroidStudio, но когда я пытаюсь использовать этот контекст, Realm терпит неудачу с io.realm.exceptions.RealmIOException: Failed to open . Permission denied. open() failed: Permission denied.

кто-нибудь знает, есть ли возможность проверить Realm, не влияя на живые данные?

3 ответов


Я был на самом деле довольно слеп, и решение было довольно простым, просто используя другое имя для RealmDatabase во время настройки теста при создании его конфигурации. Мое решение теперь выглядит следующим образом:

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

Если вы используете JUnit4, вы можете использовать правило TemporaryFolder для создания тестовой папки: 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
}

незначительная альтернатива использованию setDefaultConfiguration может быть использовать Realm.getInstance на @BeforeClass:

RealmConfiguration testConfig = 
   new RealmConfiguration.Builder().
      inMemory().
      name("test-realm").build();

Realm testRealm = Realm.getInstance(testConfig);

и ввести testRealm в свои классы.