2016-01-29 15 views
5

「ルーパーなしスレッドから開かれた」私はレルム(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() { ...} 

を私のテストを変えた:私は付け加えました。なぜ誰かが解決策を知っていますか?ありがとう。

答えて

0

@UiThreadTestは実際には、UI要素にアクセスできるスレッド上の作業ルーパスレッドには載せません。私は本当にその違いがある理由の詳細を調べていないことを告白する必要があります。代わりにLooperスレッド用のカスタムルールを使用しています(これもRealmインスタンスをクリーンアップします)。あなたはここでそれを見ると、おそらくインスピレーションとしてこと使用することができます。このため

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

+0

感謝を!どのようにこれらのテストは合格するのですか?特に 'findFirstAsync_emittedOnSubscribe'はこれが私がやっていることとほとんど同じです。 https://github.com/realm/realm-java/blob/master/realm/realm-library/src/androidTest/java/io/realm/RxJavaTests.java –

+0

「AndroidSchedulers.mainThread」は実際には疑いがありますユニットテスト中は有効ではありません。私たちのテストでは、デフォルトのスレッドだけを観察しています。しかし、私はそれをテストしていないと思う。 –

+0

あなたの助けてくれてありがとう、私は今私が実行したいテストの同等のを実行するために私たちのレルムテストリグのアプリケーションを展開するつもりだと思う。それはより簡単で、我々はまだカバレッジを得る。レルムの偉大だがユニットテストはかなり難しいようだが、これはロードマップ上の何か? –