Tôi muốn viết một loại "kiểm tra hộp đen" cho một thành phần, sử dụng nội bộ RxJava.RxJava đăng ký và quan sát trên cùng một luồng như kiểm tra đơn vị
Nội bộ nó sử dụng Retrofit
trả về Observable
để tạo httpcall và sau đó sử dụng .flatmap()
để xử lý trong tương lai dữ liệu được truy xuất từ trang bị thêm. Ý tưởng là để cung cấp cho rằng thành phần một Transformer
cho thiết lập các schedulers vào người quan sát như thế này:
class DefaultTransformer <T> implements Transformer<T, T> {
public Observable<T> call(Observable<T> observable) {
return observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread());
}
}
Component tôi làm điều gì đó như thế này:
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);
}
Trong sản xuất tôi vượt qua DefaultTransformer
như tham số, nhưng đối với Bài kiểm tra đơn vị tôi muốn gửi Transformer
chạy trên cùng một luồng với bài kiểm tra đơn vị, vì vậy mọi thứ sẽ chạy đồng bộ (không đồng bộ).
Tôi cố gắng đó:
class UnitTestTransformer <T> implements Transformer<T, T> {
public Observable<T> call(Observable<T> observable) {
return observable.subscribeOn(Schedulers.test()).observeOn(AndroidSchedulers.test());
}
}
Nhưng nó vẫn chạy async trong các thử nghiệm đơn vị của tôi. Tôi cũng đã thử Scheduler.immediate()
. toBlocking()
có vẻ không phải là một tùy chọn, bởi vì nó không còn là Observable
nữa. Bất cứ ý tưởng những gì có thể là sai?
'observable.compose (transformer);' là vấn đề. Tất cả các trường hợp 'Observable' là không thay đổi và gọi' compose' không thay đổi 'Observable' hiện có nhưng trả về một cái mới (được bỏ qua trong mã của bạn). 'observable.compose (transformer) .subscribe (this)' sẽ hoạt động tốt. –
Một điều nữa. Tất cả 'Observable' được trả về bởi' retrofit' đã có một 'Scheduler' được chỉ định bởi vì' retrofit' gọi 'subscribeOn' nội bộ. Gọi 'subscribeOn' một lần nữa sẽ không thực sự thay đổi lịch trình cuối cùng trong đó cuộc gọi mạng sẽ được thực hiện. –
Nếu bạn muốn kiểm tra mã của mình, bạn nên sử dụng toán tử 'toBlocking' (được sử dụng rất nhiều trong hầu hết các kiểm thử đơn vị RxJava') –