java - 测试 RxJava2 doOnComplete()

标签 java android unit-testing junit rx-java2

正如您从下面的代码中看到的,我正在尝试测试在我的存储库中发生的 doOnComplete() 调用的行为。但是,当我模拟客户端的注入(inject)依赖项时,我使用 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());
    }
}

最佳答案

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

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


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

关于java - 测试 RxJava2 doOnComplete(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44448788/

相关文章:

java - 广度优先搜索 - Java

java - 在 Android 中使用 android.net 或 java.net 哪个 Socket API 进行 UDP 通信?

python - 与 Python 单元测试相关的测试发现意味着什么?

Python Unittest 和 Multiprocessing 在顺序运行时失败

java - 在 Windows 7 操作系统上使用 EvoSuite 插件

java - BlockingQueue.peekWait()

android - "I/ActivityManager: Displayed...activity...+850ms"由什么组成?

postgresql - 如何在无法迁移表的情况下对 Laravel 应用程序进行单元测试,因为迁移是由另一个应用程序处理的

java - 根据列将getString结果拆分为多个值

java - 使用httpclient时抛出OutOfMemoryError