Я хочу написать своего рода «тест черного ящика» для компонента, который внутренне использует RxJava.
Внутри он использует Retrofit
, который возвращает Observable
для выполнения HTTP-вызова, а затем использует .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
. Есть идеи, что может быть не так?
observable.compose(transformer);
это проблема. Все экземплярыObservable
являются неизменяемыми, и вызовcompose
не изменяет существующийObservable
, а возвращает новый (который игнорируется в вашем коде).observable.compose(transformer).subscribe(this)
должно работать нормально. - person Vladimir Mironov   schedule 18.03.2015Observable
, возвращаемыеretrofit
, уже имеют указанныйScheduler
, потому чтоretrofit
вызываетsubscribeOn
внутренне. ВызовsubscribeOn
еще раз фактически не изменит окончательный планировщик, в котором будет выполняться сетевой вызов. - person Vladimir Mironov   schedule 18.03.2015toBlocking
(который очень часто используется в большинстве модульных тестовRxJava
). - person Vladimir Mironov   schedule 18.03.2015compose()
! Значит нет возможности обновитьScheduler
дооснащения?toBlock()
у меня не сработает, потому что я не могу изменить методexecute()
моего компонента, или вы видите обходной путь для этого? Метод execute будет вызываться внутри (среди других вызовов, отличных от RxJava). Единственное, что я могу сделать, это установитьScheduler
сComponent.setScheduler(Transformer t)
, который будет передан в качестве аргумента дляComponent.execute()
- person sockeqwe   schedule 18.03.2015