android - 使用 RxJava 测试 Android Realm - "opened from a thread without a Looper"异常

标签 android unit-testing junit 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);
}

这在 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 实例)。您可以在这里看到它,也许可以将其用作灵感:

https://github.com/realm/realm-java/blob/master/realm/realm-library/src/androidTest/java/io/realm/rule/RunInLooperThread.java

关于android - 使用 RxJava 测试 Android Realm - "opened from a thread without a Looper"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35082189/

相关文章:

android - 选项卡主机中的问题

java - 创建包含所有自动化测试的可执行 .jar

java - Mockito - 所需返回的模拟对象未在测试类(CUT)中使用

android - 出现错误警告时隐藏密码切换启用

java - Retrofit JSON Error 解析错误

android - 致命异常 : java. lang.IllegalStateException 没有从 INITIALIZED 下来的事件

javascript - 如何测试 $rootScope.$emit 事件?

java - playframework 2.2 功能测试

vb.net - vb.net 项目的单元测试

java - JUnit 参数化测试不与 Mockito、Spring、Reflection 和 AspectJ 单独运行