我有一个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?
答案 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);