在我的应用程序中,我使用Repository和RxJava访问我的业务对象。从我的Presenter层我可以要求Repository给我ObjectA或者让我得到ObjectB,Respository将分别返回一个Observable或Observable。
有时候我需要同时获得ObjectA和ObjectB。我想知道使用RxJava获取两个对象的选项是什么,它还允许对我的Presenter层进行单元测试。
我最初实现这个的方法是使用flatMap()运算符。所以我做这样的事情:
//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;
}
});
当我订阅了obsResult时,obsA运行并且我可以在flatMap()运算符中访问它的结果。我得到了一个结果句柄并将其存储在我的Presenter中。然后obsB运行,我的结果在我的订阅者。这很好但我无法帮助,但我认为我并没有真正做到这一点。一个问题是,尽管我的Repository类可能有100%的测试覆盖率,但现在我正在操作来自Repository类的observable,我很难搞清楚如何测试obsResult或验证我在flatMap()中编写的代码是否正确。
我应该将方法添加到我的Repository层(例如getObjectAandObjectB)并返回一个Observable并完成Repository层中的所有工作吗?这将允许我在Repository层测试中测试结果Observable,而不是尝试从两个单独的Observable创建一个新的Observable,并找出如何在我的Presenter层中测试它。
我看过的另一件事是使用zip()运算符。这看起来像这样:
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);
}
});
现在,当我订阅了我的resultObs时,我得到了一个带有ObjectA和Object B的复合对象。这很漂亮,但仍然需要我在Func2中编写需要测试的代码。
有哪些方法可以实现我的业务对象调用组合目标,同时还允许结果Observable的可测试性?