2016-12-02 13 views
1

私のアプリケーションでは、リポジトリとRxJavaを使用してビジネスオブジェクトにアクセスしています。私のPresenterレイヤーからは、ObjectAを取得するか、ObjectBを取得するようリポジトリに依頼することができ、リポジトリはObservableまたはObservableをそれぞれ返します。RxJavaを使用したデータベース呼び出しの結合

時々私はObjectAとObjectBの両方を取得する必要があります。私は、RxJavaを使って両方のオブジェクトをフェッチするオプションが、私のPresenterレイヤーの単体テストを可能にするのではないかと思っています。

私が最初に実装した方法は、flatMap()演算子を使用することでした。だから私はこのような何かをしたい:私はobsResultを購読すると

//In Presenter layer 
Observable<ObjectA> obsA = repository.getObjectA(); 
Observable<ObjectB> obsB = repository.getObjectB(); 

Observable<ObjectB> obsResult = obsA.flatMap(new Func1<ObjectA, Observable<ObjectB>>() { 
@Override 
public Observable<ObjectB> call(ObjectA a) { 
    mObjectA = a; 
    return obsB; 
} 
}); 

、obsAが実行され、私はflatMap()オペレータにその結果をアクセスすることができます。その結果を処理してプレゼンターにフィールドとして保存します。その後、obsBが実行され、私の加入者にその結果が得られます。これはうまく動作しますが、私は助けることができませんが、私は本当にそれを正しくしていないと思う。 1つの問題は、私がRepositoryクラスで100%のテストカバレッジを持っているかもしれないが、今はRepositoryクラスから出てくるobservablesを操作しているし、obsResultをテストする方法や私がflatMap()で書くコードは正しいです。

リポジトリレイヤにgetObjectAandObjectBなどのメソッドを追加してObservableを返し、すべての作業をリポジトリレイヤで行う必要がありますか?これにより、2つの別々のObservableから新しいObservableを作成し、それをPresenterレイヤーでテストする方法を理解するのではなく、リポジトリレイヤーテストでObservableの結果をテストできます。

もう1つは、zip()演算子を使用しています。今、私は私のresultObsに加入したときに私が得る複合オブジェクトはObjectAにして、オブジェクトBの両方で返さこれはかなり滑りやすいですが、まだする必要がfunc2の中にコードを書くために私を必要と

Observable<ObjectA> obsA = repository.getObjectA(); 
Observable<ObjectB> obsB = repository.getObjectB(); 

Observable<CombinedObjectAandObjectB> resultObs = obsA.zipWith(obsB, new Func2<ObjectA, ObjectB, CombinedObjectAandObjectB>() { 
      @Override 
      public Object call(ObjectA a, ObjectB b) { 
       return new CombinedObjectAandObjectB(a,b); 
      } 
     }); 

:これは次のようになりますテストされる。

ビジネスオブジェクトの呼び出しを組み合わせて、Observableの結果をテストできるようにする目標を達成するための方法は何ですか。

答えて

0

あなたはほとんどあなた自身の質問をあなたにあげます。 Clean Architectureによれば、すぐに使えるモデルをプレゼンテーションレイヤーに渡す方が良いでしょう。結合論理はドメイン層に属する。したがって、リポジトリにはzip()を使用します(ただし、データレイヤです)。例:

Observable.zip(modelAObservable, modelBOsbervable, (A, B) -> { 
      combineModels(A, B); 
     })... 

private CombinedModel combineModels(modelA, modelB) { 
    //combining logic 
} 

通常どおりテストしてください。例:

ModelA A = new ModelA... 
ModelB B = new ModelB... 
CombinedModel expectedResult = new CombinedModel... 

assertEquals(combineModels(A, B), expectedResult); 
関連する問題