Rx java RxJava在与单元测试相同的线程上订阅和观察

Rx java RxJava在与单元测试相同的线程上订阅和观察,rx-java,rx-android,Rx Java,Rx Android,我想为一个内部使用RxJava的组件编写一种“黑盒测试” 在内部,它使用改装,返回一个可观察的来进行httpcall,然后使用.flatmap()。想法是给该组件一个转换器,用于在观察者上设置调度器,如下所示: class DefaultTransformer <T> implements Transformer<T, T> { public Observable<T> call(Observable<T> observable) {

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

在内部,它使用
改装
,返回一个
可观察的
来进行httpcall,然后使用
.flatmap()。想法是给该组件一个
转换器
,用于在观察者上设置调度器,如下所示:

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);
}

但在我的单元测试中它仍然异步运行。我还尝试了
Scheduler.immediate()
toBlocking()
似乎不是一个选项,因为它不再是可观察的
。你知道哪里有问题吗?

如果改变
execute()
的调用模式不是一个选项,那么你可以尝试使用RxJava插件机制

您可以提供:

  • RxJavaSchedulersHook
    覆盖测试执行期间提供的调度器,并使其同步执行
  • rxjavaobserveExecutionHook
    连接到可观测执行管道,并使用某种同步方法(如a)等待可观测订阅完成,然后继续

我遇到了一个类似的问题,并使用TestObserver()类解决了它

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

getOnCompletedEvents()
getOnErrorEvents()
getOnNextEvents()
我希望这也能帮助你,如果你能注入你的订户。 下面是我如何测试它的一个示例:

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

assertThat(testObserver.getOnErrorEvents().size()).isEqualTo(0);
assertThat(testObserver.getOnNextEvents().get(0)).isNotNull();
...
TestObserver TestObserver=newtestobserver();
myObservableSupplyingMethod().subscribe(testObserver);
assertThat(testObserver.GetOneErrorEvents().size()).isEqualTo(0);
assertThat(testObserver.getOnNextEvents().get(0)).isNotNull();
...

可观察。组成(变压器)是问题所在。所有
Observable
实例都是不可变的,调用
compose
不会更改现有的
Observable
,而是返回一个新实例(在代码中被忽略)<代码>可观察。组合(变压器)。订阅(此)
应该可以正常工作。还有一件事。由于
reformation
内部调用
subscribeOn
,因此
reformation
返回的所有
可观察的
都已指定了
调度程序。再次调用
subscribeOn
实际上不会改变执行网络调用的最终计划程序。如果要测试代码,应该使用
toblock
操作符(在大多数
RxJava
单元测试中使用得非常多),您好,感谢
compose()
提示!所以没有机会更新改装的
计划程序
toBlock()
对我不起作用,因为我无法更改组件的
execute()
方法,或者您看到了解决方法吗?execute方法将被内部调用(在其他非RxJava调用中)。我唯一能做的就是用
Component.setScheduler(Transformer t)
设置
Scheduler
,它将作为参数传递给
Component.execute()
TestObserver<MyModel> testObserver = new TestObserver<>();
myObservableSupplyingMethod().subscribe(testObserver);

assertThat(testObserver.getOnErrorEvents().size()).isEqualTo(0);
assertThat(testObserver.getOnNextEvents().get(0)).isNotNull();
...