5

我想为内部使用 RxJava 的组件编写一种“黑盒测试”。

在内部,它使用Retrofitwhich 返回Observable一个 httpcall,然后它用于.flatmap() 将来处理从改造中检索到的数据。我们的想法是为该组件提供一个Transformer用于在观察者上设置调度程序的方法,如下所示:

class DefaultTransformer <T> implements Transformer<T, T> {

   public Observable<T> call(Observable<T> observable) { 
      return observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread());
   }
}

我的组件做这样的事情:

void execute(Transformer<T, T> scheduler){
     Observable<List<Team>> observable = retrofitApi.getLeague(leagueId, seasonId)
        .flatMap(new Func1<LeagueWrapper, Observable<List<Team>>>() {
          @Override public Observable<List<Team>> call(LeagueWrapper wrapper) {                
             return Observable.just(wrapper.getLeague().getTeams());
          }
        });

   observable.compose(transformer);

   observable.subscribe(this);
}

在生产中,我DefaultTransformer作为参数传递,但是对于单元测试,我想提交一个Transformer在与单元测试相同的线程上运行的,所以一切都应该同步运行(而不是异步)。

我试过了:

class UnitTestTransformer <T> implements Transformer<T, T> {

       public Observable<T> call(Observable<T> observable) { 
          return observable.subscribeOn(Schedulers.test()).observeOn(AndroidSchedulers.test());
       }
    }

但它仍然在我的单元测试中运行异步。我也试过了Scheduler.immediate()toBlocking()似乎不是一个选项,因为它Observable不再是一个选项。知道有什么问题吗?

4

2 回答 2

3

如果execute()无法更改调用方式的模式,您可能需要尝试使用 RxJava 插件机制。

https://github.com/ReactiveX/RxJava/wiki/Plugins

您可以提供:

  • RxJavaSchedulersHook覆盖测试执行期间提供的调度程序并让它们同步执行
  • RxJavaObservableExecutionHook挂钩到 Observable 执行管道并使用某种同步方法(如CountdownLatch)等待 Observable 订阅完成,然后再继续
于 2015-03-23T20:49:18.683 回答
0

我有一个类似的问题,并通过使用类 TestObserver ( http://reactivex.io/RxJava/javadoc/rx/observers/TestObserver.html )解决了它

它有以下三种方法可以访问接收到的事件:

getOnCompletedEvents()
getOnErrorEvents()
getOnNextEvents()

如果您能以某种方式注入订阅者,我希望这也能对您有所帮助。这是我如何测试它的示例:

TestObserver<MyModel> testObserver = new TestObserver<>();
myObservableSupplyingMethod().subscribe(testObserver);

assertThat(testObserver.getOnErrorEvents().size()).isEqualTo(0);
assertThat(testObserver.getOnNextEvents().get(0)).isNotNull();
...
于 2015-06-03T12:08:50.517 回答