我无法确定Completable
在我的测试中是否已订阅 a,例如:
interface IWebApi {
Observable<Data> download();
}
interface IDataRepository {
Completable insert(Data data);
}
class SyncService {
IWebApi webApi;
IDataRepository repository;
public SyncService(IWebApi webApi, IDataRepository repository) {
this.webApi = webApi;
this.repository = repository;
}
public Completable sync() {
return webApi.download()
.flatMapCompletable((Data data) -> { repository.insert(data) })
}
}
然后在我的测试中:
@Test
public void syncTest() {
Data data = new Data();
IDataRepository repository = mock (IDataRepository.class);
IWebApi webApi = mock (IWebApi.class);
given(webApi.download()).willReturn(Observable.just(data));
given(repository.insert(data)).willReturn(Completable.complete());
TestObserver<Void> observer = new TestObserver<Void>();
SyncService service = new SyncService(webApi, repository);
service.sync()
.subscribe(observer);
observer.assertComplete();
verify(repository).insert(data);
}
这个测试会通过。但我可以重写同步方法而不使用flatMapCompletable
这样的:
public Completable sync() {
return webApi.download()
.doOnNext((Data data) -> { repository.insert(data) })
.ignoreElements();
}
然后我的测试将通过,但代码将无法工作,因为即使我认为我已经调用了 insert 方法,但我没有调用subscribe()
它。
我应该如何处理这件事?
PS 我是 RxJava 的新手,所以如果我没有使用最佳实践,我很想知道 :)
更新
修复了.ingnoreElements()
Maxim Ostrovidov指出的不跟注的错误