私のアーキテクチャでは、私は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が正しく呼び出されることを確認します。
これは正常に動作するように見えますか?私は、組成が正しいことを両方をテストすることができて、観察可能なものが実際にそれに加入しているときに実際にそれが何をするのかを検証することができますが、より良い方法があれば私は不思議です。
rxjavaライブラリ自体の正しさをテストする以外にも、最初のアプローチが便利だと思います。 .cache()演算子があなたのコンポジションに存在することを要求したとしましょう。どのようにテストしますか?別の開発者が.cache()演算子を削除した場合はどうなりますか?コンポジションをテストせずに呼び出されるようにする方法はありますか? (知っていればそれが素晴らしいだろう)。 – neonDion
複合サブスクリプションでは、「私はあなたが思うとは思わない」と言っているものは何ですか?技術的には1つのサブスクリプションしか作成されないため、複合サブスクリプションは複数のサブスクリプションを持つことはありません。 – neonDion
私の混乱の一部は、サブスクリプションラインで 'subscriber'と' observable'の役割を逆転させたことです。 –