gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:13:47 25 4
gpt4 key购买 nike

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

它在内部使用 Retrofit返回 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了。知道有什么问题吗?

最佳答案

如果改变模式如何execute()被调用不是一个选项,你可能想尝试使用 RxJava 插件机制。

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

您可以提供:

  • RxJavaSchedulersHook覆盖测试执行期间提供的调度程序并使它们同步执行
  • RxJavaObservableExecutionHook Hook 到 Observable 执行管道并使用某种同步方法(如 CountdownLatch )等待 Observable 订阅完成,然后继续
  • 关于rx-java - RxJava 在与单元测试相同的线程上订阅和观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29129310/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com