我想为内部使用 RxJava 的组件编写一种“黑盒测试”。
在内部,它使用Retrofit
which 返回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
不再是一个选项。知道有什么问题吗?