我有以下代码,基于 Realm ( https://realm.io/docs/java/latest/#rxjava ) 提供的文档
public Observable<Foo> getFooById(String id) {
realm = Realm.getInstance(realmConfiguration);
return realm.where(Foo.class)
.equalTo("id", id)
.findFirstAsync()
.asObservable()
.filter(this::filterResult);
}
这在 App 中按预期工作,但是当涉及到测试时,事情变得有点棘手。我有以下测试(为了简单起见进行了精简):
@Test
public void testRealmExample() {
RealmConfiguration config = new RealmConfiguration.Builder(context)
.name("test.realm")
.inMemory()
.build();
DataManager dataManager = new DataManager(config);
TestSubscriber<Foo> testSubscriber = new TestSubscriber<>();
dataManager.getFoo("").observeOn(AndroidSchedulers.mainThread()).subscribe(testSubscriber);
testSubscriber.assertNoErrors();
}
执行测试时发生以下错误 java.lang.IllegalStateException: Your Realm is opened from a thread without a Looper.异步查询需要处理程序来发送查询结果
。
为了解决这个问题,我阅读了 Realm GitHub page他们使用注释 @UiThreadTest
强制测试在 UI 线程上运行,根据我的理解,这是一个循环线程,因此这应该可以解决我的问题。我补充说:
@Rule
public final UiThreadTestRule uiThreadTestRule = new UiThreadTestRule();
并更改了我的测试以包含注释
@Test
@UiThreadTest
public void testRealmExample() { ...}
这仍然会产生相同的异常。有谁知道为什么和解决方案?谢谢。
最佳答案
@UiThreadTest
实际上并没有把你放在一个工作的 Looper 线程上,只是放在一个可以访问 UI 元素的线程上。我必须承认我还没有真正研究过为什么会有这种差异的细节。我们正在为 Looper 线程使用自定义规则(这也会清理我们的 Realm 实例)。您可以在这里看到它,也许可以将其用作灵感:
关于android - 使用 RxJava 测试 Android Realm - "opened from a thread without a Looper"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35082189/