Gra*_*ith 5 junit android unit-testing realm rx-java
我有以下代码,基于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);
}
Run Code Online (Sandbox Code Playgroud)
这可以在应用程序中按预期工作,但是当涉及到测试时,事情变得有点棘手.我有以下测试(剥离以保持简单):
@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();
}
Run Code Online (Sandbox Code Playgroud)
执行测试时,会发生以下错误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页面上读到他们使用注释@UiThreadTest强制测试在UI线程上运行,从我的理解是一个looper线程,因此这应该解决我的问题.我补充说:
@Rule
public final UiThreadTestRule uiThreadTestRule = new UiThreadTestRule();
Run Code Online (Sandbox Code Playgroud)
并改变了我的测试以包含注释
@Test
@UiThreadTest
public void testRealmExample() { ...}
Run Code Online (Sandbox Code Playgroud)
这仍然会产生相同的例外.有谁知道为什么和解决方案?谢谢.
实际上并@UiThreadTest没有将您置于工作的 Looper 线程上,而只是置于可以访问 UI 元素的线程上。我必须承认我还没有真正研究过为什么会出现这种差异的细节。我们对 Looper 线程使用自定义规则(这也会清理我们的 Realm 实例)。您可以在这里看到它,也许可以将其用作灵感: