2017-03-10 11 views
0

私のアーキテクチャでは、私はUseCaseというクラスを使用して、観測可能なものを構成し、サブスクライブします。 UseCaseは、コンストラクタ内の1つまたは複数のリポジトリを取り込み、オブザーバブルを作成し、そのオブジェクトにサブスクライブする「execute」メソッドを持っています。ユニットテストRxJavaの構成と機能

ここに簡単な例を示します。

public class MyUseCase { 
    IRepoA mRepoA; 
    IRepoB mRepoB; 
    Scheduler mScheduleOn; 
    Scheduler mObserveOn; 
    CompositeSubscription mCompositeSubscription; 

    public MyUseCase(IRepoA repoA, IRepoB repoB, Scheduler subscribeOn, Scheduler observeOn, CompositeSubscription compositeSubscription) { 
    mRepoA = repoA; 
    mRepoB = repoB; 
    mSubscribeOn = subscribeOn; 
    mObserveOn = observeOn; 
    mCompositeSubscription = compositeSubscription; 
} 

public Observable execute(Observable observable, Subscriber subscriber) { 
    if (observable == null) { 
        observable = mRepoA 
        .fetchLoginPreference() 
        .map(new Func1<LoginPreference, String>() { 
         @Override 
         public String call(LoginPreference loginPreference) { 
          return loginPreference.getActivationCode(); 
         } 
        }) 
        .flatMap(new Func1<String, Observable<List<RegistrationField>>>() { 
         @Override 
         public Observable<List<RegistrationField>> call(String s) { 
          return mRepoB.fetchRegistrationFields(s); 
         } 
        }) 
    } 
    mCompositeSubscription.add(observable.subscribeOn(mSubscribeOn).observeOn(mObserveOn).subscribe(observable)); 
    return observable; 
} 
} 

ここでテストすることがいくつかありますが、私はそれについてどうやって行くのが最善の方法なのか疑問に思っています。

1)観測値が正しく構成されていることをテストしたい。つまり、.map()、.flatMap()、および.cache()が呼び出されたことを確認したいと思います。私がこれまでにやったことは、モックを使用して、それらのメソッドがモックで呼び出されたことを確認することです。たとえば、repoA.fetchLoginPreference()はモックを観測可能な状態に戻し、モックに.map()などが呼び出されていることを確認できます。

2)私が観察することが実際に私がそれを購読するとき正しく動作することをテストしたい。これをテストするには、モックの代わりに実際のObservablesを使うことです。 RepoA.fetchLoginPreference()が呼び出されると、Observable.just(mockLoginPreference)が返されます。次に、TestSubscriberを使用して、結果として得られるobservableを購読し、Func1コールバックからmockが正しく呼び出されることを確認します。

これは正常に動作するように見えますか?私は、組成が正しいことを両方をテストすることができて、観察可能なものが実際にそれに加入しているときに実際にそれが何をするのかを検証することができますが、より良い方法があれば私は不思議です。

答えて

1

最初のアプローチは、RxJavaの動作を学習する場合、特にswitchMap()のようなよりエキゾチックな演算子を使用する場合に便利です。しかし、特にrxjavaライブラリ自体の正確性をテストする必要はありません。

第2のアプローチは非常に意味があります。モックと観察可能/テスト加入者の組み合わせであるユニットテストハーネスを持つことは、リアクティブプログラミングの非常に強力な機能です。

あなたはそれがあなたが思っているとは思わないので、あなたはCompositeSubscription()を扱う際に両方のアプローチが必要かもしれないと言われています。オペレーションがスレッド上で確実に行われるように、いくつかの低レベルのデバッグプローブが必要です

+0

rxjavaライブラリ自体の正しさをテストする以外にも、最初のアプローチが便利だと思います。 .cache()演算子があなたのコンポジションに存在することを要求したとしましょう。どのようにテストしますか?別の開発者が.cache()演算子を削除した場合はどうなりますか?コンポジションをテストせずに呼び出されるようにする方法はありますか? (知っていればそれが素晴らしいだろう)。 – neonDion

+0

複合サブスクリプションでは、「私はあなたが思うとは思わない」と言っているものは何ですか?技術的には1つのサブスクリプションしか作成されないため、複合サブスクリプションは複数のサブスクリプションを持つことはありません。 – neonDion

+0

私の混乱の一部は、サブスクリプションラインで 'subscriber'と' observable'の役割を逆転させたことです。 –

関連する問題