Тестирование 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);