在Android下测试领域

8
我有一个Android应用程序,使用Realm来持久化数据。现在我想为这个应用程序编写一个单元测试,利用Realm进行测试。
然而,我不希望单元测试干扰我的现有Realm数据。因此,我想为我的测试实例生成不同的Realm文件。我不在意它们是否具有不同的名称或存储在不同的目录中。
我尝试使用RenamingDelegatingContext,但没有成功。根据https://groups.google.com/forum/#!msg/realm-java/WyHJHLOqK2c/WJFYvglIGk0JgetInstance()只使用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个回答

9

实际上我当时很盲目,解决方案非常简单,只需要在测试设置期间使用不同的名称来生成Realm数据库配置即可。我的解决方案如下:

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

8
如果你正在使用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
}

我目前正在使用JUnit3,所以这对我来说似乎不可用。我通过使用ConfigurationBuilder中的不同数据库文件解决了我的问题,但是我会记住你的解决方案,因为它似乎更好一些,因为它在测试后还会删除临时文件。 - Benjamin Scharbau
1
@Christian 尝试使用Junit4运行上述代码时,getInstance()方法出现以下异常: java.lang.UnsatisfiedLinkError: no realm-jni in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865) at java.lang.Runtime.loadLibrary0(Runtime.java:870) at java.lang.System.loadLibrary(System.java:1122) at io.realm.internal.RealmCore.loadLibrary(RealmCore.java:117) - GaneshP
1
目前 Realm 不支持在 JVM 上进行测试,您需要在设备上运行测试。 - Christian Melchior
有没有更好的方法编写 Realm 查询的单元测试,而不是模拟每个小函数的响应? - GaneshP
@ChristianMelchior,您能否解释一下在这种情况下使用临时文件夹规则和将领域实例设置为内存之间的区别? - Mike Herasimov

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接