「ルーパーなしスレッドから開かれた」私はレルム(https://realm.io/docs/java/latest/#rxjava)から提供されているドキュメントをオフに基づいて、以下のコードを、持っているテストのAndroidレルム - 例外
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
を発生します。
これに対処するには、@UiThreadTest
という注釈を使用してUIスレッドでテストを強制することをお読みください。これは私の理解ではルーパースレッドであるため、問題が解決するはずです。
@Rule
public final UiThreadTestRule uiThreadTestRule = new UiThreadTestRule();
をし、これはまだ同じ例外を生成する注釈を含めること
@Test
@UiThreadTest
public void testRealmExample() { ...}
を私のテストを変えた:私は付け加えました。なぜ誰かが解決策を知っていますか?ありがとう。
感謝を!どのようにこれらのテストは合格するのですか?特に 'findFirstAsync_emittedOnSubscribe'はこれが私がやっていることとほとんど同じです。 https://github.com/realm/realm-java/blob/master/realm/realm-library/src/androidTest/java/io/realm/RxJavaTests.java –
「AndroidSchedulers.mainThread」は実際には疑いがありますユニットテスト中は有効ではありません。私たちのテストでは、デフォルトのスレッドだけを観察しています。しかし、私はそれをテストしていないと思う。 –
あなたの助けてくれてありがとう、私は今私が実行したいテストの同等のを実行するために私たちのレルムテストリグのアプリケーションを展開するつもりだと思う。それはより簡単で、我々はまだカバレッジを得る。レルムの偉大だがユニットテストはかなり難しいようだが、これはロードマップ上の何か? –