gpt4 book ai didi

java - 如何断言 Completable 是否已被订阅/完成 (RxJava2)

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

我无法确定是否是 Completable已在我的测试中订阅,例如:

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();
}

然后我的测试会通过但代码不起作用,因为即使我认为我已经调用了插入方法,但我没有调用 subscribe()在里面。

我应该如何处理这个问题?

P.S 我是 RxJava 的新手,所以如果我不使用最佳实践,我很想知道 :)

更新

修复未调用 .ingnoreElements() 的错误马克西姆·奥斯特罗维多夫指出

最佳答案

您可以使用 test()运算符(operator)为方便:

SyncService service = new SyncService(webApi, repository);
TestObserver observer = service.sync().test();

But I Could rewrite the sync method without using flatMapCompletable like this:


public Completable sync() {
return webApi.download()
.doOnNext((Data data) -> { repository.insert(data) })
}

这不会编译,因为 doOnNext仅用于对项目调用操作,不更改流返回类型。在您的情况下,方法期望 Completable但实际上它会是 Observable<Data> .

即使您强制更改最终的流类型:
public Completable sync() {
return webApi.download()
.doOnNext((Data data) -> { repository.insert(data) })
.ignoreElements(); //converts to Completable
}
repository.insert(data)不会被调用,因为 doOnNext不订阅您传递的任何内容并且不返回任何内容:
//under the hood of lambdas
.doOnNext(new Consumer<Data>() {
@Override
public void accept(Data data) throws Exception {

}
})

您的初始代码最适合您想要实现的目标:
public Completable sync() {
return webApi.download()
.flatMapCompletable((Data data) -> { repository.insert(data) })
}
flatMapCompletable订阅已通过 Completable使用 Observable 发出的项目:
.flatMapCompletable(new Function<Data, CompletableSource>() {
@Override
public CompletableSource apply(Data data) throws Exception {
return repository.insert(data);
}
})

编辑

测试 repository.insert的事实订阅您可以使用另一个 TestObserverCompletable与应用 doOnSubscribe :
TestObserver repositoryInsertObserver = TestObserver.create();
Completable insertCompletable = Completable.complete()
.doOnSubscribe(d -> repositoryInsertObserver.onSubscribe(d));

//pass completable to your mock
given(repository.insert(data)).willReturn(insertCompletable);

//and verify that subscription took place
repositoryInsertObserver.assertSubscribed();

关于java - 如何断言 Completable 是否已被订阅/完成 (RxJava2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41699020/

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