我有一个Android应用程序,我使用Realm来保存数据.我现在想利用Realm为这个应用程序编写一个单元测试.
但是,我不希望单元测试干扰我现有的Realm数据.所以我想为我的测试实例生成不同的Realm文件.我不在乎他们是否有不同的名称,或者存储在不同的目录中.
我试过用a RenamingDelegatingContext
,但没有成功.根据https://groups.google.com/forum/#!msg/realm-java/WyHJHLOqK2c/WJFYvglIGk0J getInstance()
仅使用Context
to调用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?
我实际上非常盲目,只需在测试设置期间为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 }