作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为内部使用 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/
我是一名优秀的程序员,十分优秀!