在Android

时间:2015-12-11 04:17:50

标签: java android unit-testing realm

我有一个Android应用程序,我使用Realm来保存数据。我现在想利用Realm为这个应用程序编写一个单元测试。

但是,我不希望单元测试干扰我现有的Realm数据。所以我想为我的测试实例生成不同的Realm文件。我不在乎他们是否有不同的名称,或者存储在不同的目录中。

我曾尝试使用RenamingDelegatingContext,但没有成功。根据{{​​3}} getInstance(),只使用Context来调用getFilesDir(),这似乎不会覆盖getFilesDir()方法,因此我最终使用了我的直播测试数据。

接下来我尝试使用IsolatedContext,但IsolatedContext.getFilesDir()返回null,所以这也没有成功。

最后,我尝试编写一个扩展RenamingDelegatingContext的类,覆盖getFilesDir(),返回一个不同的目录供Realm使用。我使用AndroidStudio的DeviceMonitor创建了目录,但当我尝试使用此上下文时,Realm失败并显示io.realm.exceptions.RealmIOException: Failed to open . Permission denied. open() failed: Permission denied

有没有人知道是否有可能在不影响实时数据的情况下测试Realm?

3 个答案:

答案 0 :(得分:8)

我实际上非常盲目,只需在测试设置期间为RealmDatabase使用不同的名称,同时生成其配置,该解决方案非常简单。我的解决方案现在看起来如下:

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

答案 1 :(得分:7)

如果您使用的是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
}

答案 2 :(得分:2)

使用setDefaultConfiguration的次要替代方法可能是@BeforeClass中的directly use Realm.getInstance

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

Realm testRealm = Realm.getInstance(testConfig);

inject the testRealm into your classes