【问题标题】:Testing RxJava2 doOnComplete()测试 RxJava2 doOnComplete()
【发布时间】:2017-11-10 22:33:47
【问题描述】:

正如您从下面的代码中看到的那样,我正在尝试测试在我的存储库中发生的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());
    }
}

【问题讨论】:

    标签: java android unit-testing junit rx-java2


    【解决方案1】:

    您的代码中的问题是,blockingFirst() 不关心监听完整事件的发生。它将立即从流中返回第一项和dispose from observable

    相反,您可以这样执行断言:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      相关资源
      最近更新 更多