【发布时间】:2016-05-07 01:12:52
【问题描述】:
我有以下代码,基于 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);
}
这在应用程序中按预期工作,但是在测试方面变得有点棘手。我有以下测试(精简以保持简单):
@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. Async queries need a Handler to send results of your query。
为了反驳这一点,我在Realm GitHub page 上读到他们使用注释@UiThreadTest 来强制测试在UI 线程上运行,据我了解,这是一个活套线程,因此这应该可以解决我的问题。我补充说:
@Rule
public final UiThreadTestRule uiThreadTestRule = new UiThreadTestRule();
并更改了我的测试以包含注释
@Test
@UiThreadTest
public void testRealmExample() { ...}
这仍然会产生相同的异常。有谁知道为什么和解决方案?谢谢。
【问题讨论】:
标签: android unit-testing junit realm rx-java