测试RxJava2 doOnComplete()

测试RxJava2 doOnComplete(),java,android,unit-testing,junit,rx-java2,Java,Android,Unit Testing,Junit,Rx Java2,从下面的代码中可以看出,我正在尝试测试存储库中发生的doOnComplete()调用的行为。但是,当我模拟客户端的注入依赖时,我使用Observable.just()返回项目,不再调用doOnComplete()。我相信这是RxJava2有意为之。我不确定如何解决这个问题 @Singleton public class Repository { private SomeNetworkClient client; private SomeCache cache; @Inj

从下面的代码中可以看出,我正在尝试测试存储库中发生的
doOnComplete()
调用的行为。但是,当我模拟客户端的注入依赖时,我使用
Observable.just()
返回项目,不再调用
doOnComplete()
。我相信这是RxJava2有意为之。我不确定如何解决这个问题

@Singleton
public class Repository {
    private SomeNetworkClient client;
    private SomeCache cache;

    @Inject
    public Repository(SomeNetworkClient client, SomeCache cache) {
        this.client = client;
        this.cache = cache;
    }

    public Observable<SomeItem> getSomeItem() {
        return client.getSomeItem()
                .doOnComplete(() -> cache.doThisOnComplete())
                .doOnError(throwable -> someError);
    }
}

public class RepositoryTest {
    private Repository testedRepository;
    @Mock
    SomeNetworkClient client;
    @Mock
    SomeCache cache;
    @Mock
    SomeItem someItem;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        testedRepository = new Repository(client, cache);
        when(client.getSomeItem())
            .thenReturn(Observable.just(someItem));
    }

    @Test
    public void thisTestFails() {
        testedRepository.getSomeItem().blockingFirst();
        // This fails because it appears that mocking with
        // Observable.just() makes doOnComplete() not be invoked.
        verify(cache.doThisOnComplete());
    }
}
@Singleton
公共类存储库{
私有网络客户端;
私有SomeCache;
@注入
公共存储库(SomeNetworkClient客户端、SomeCache缓存){
this.client=client;
this.cache=cache;
}
公共可观察的getSomeItem(){
返回client.getSomeItem()
.doOnComplete(()->cache.doThisOnComplete())
.doError(可丢弃->某些错误);
}
}
公共类存储测试{
私有存储库测试库;
@嘲弄
一些网络客户端;
@嘲弄
SomeCache;
@嘲弄
某物某物;
@以前
公共作废设置(){
initMocks(this);
testedRepository=新存储库(客户端、缓存);
何时(client.getSomeItem())
.然后返回(可观察到的。只是(某个项目));
}
@试验
public void thisTestFails(){
testedRepository.getSomeItem().blockingFirst();
//这失败了,因为它似乎是用
//Observable.just()使doOnComplete()不被调用。
验证(cache.doThisOnComplete());
}
}

代码中的问题是,它不关心是否会发生完整的事件。它将立即返回流中的第一个项目,然后返回

相反,您可以通过以下方式执行断言:


    testedRepository
            .getSomeItem()
            .test()
            .assertComplete()