【问题标题】:RxJava: How to unit test that an Observable is observed on and subscribed on the right scheduler?RxJava:如何对在正确的调度程序上观察和订阅 Observable 进行单元测试?
【发布时间】:2017-01-20 17:26:09
【问题描述】:

我有以下场景:

interface ItemsRepository {
    Observable<List<Item>> getItems();
}

class GetItems {
    private Scheduler ioScheduler;
    private Scheduler mainScheduler;
    private ItemsRepository itemsRepository;
    GetItems(Scheduler ioScheduler, 
             Scheduler mainScheduler, 
             ItemsRepository itemsRepository) {
        this.ioScheduler = ioScheduler;
        this.mainScheduler = mainScheduler;
        this.itemsRepository = itemsRepository;
    }

    Observable execute(Susbscriber subscriber) {
        return itemsRepository.getItems()
                              .subscribeOn(ioScheduler)
                              .observeOn(mainScheduler)
                              .subscribe(subscriber);
    }
}

现在我想对 subscribeOnobserveOn 使用正确的 Schedulers 进行单元测试。

【问题讨论】:

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


【解决方案1】:

我这样做的方式是编写两个单元测试,如下所示:

@RunWith(MockitoJUnitRunner.class)
class GetItemsTest {
    private GetItems getItems;
    private TestScheduler ioScheduler = Schedulers.test();
    private TestScheduler mainScheduler = Schedulers.test();
    private TestSubscriber<List<Item>> subscriber = new TestSubscriber();
    private List<Item> items;

    @Mock
    private ItemsRepository itemsRepository;

    @Before
    private void setUp() {
        getItems = new GetItems(ioScheduler, mainScheduler, itemsRepository);
        items = anyListOf(Item.class);
        given(itemsRepository.getItems()).willReturn(Observable.just(items));
        getItems.execute();
    }

    @Test
    public void should_subscribe_repository_on_the_io_scheduler throws Exception {
        subscriber.assertNoValues();

        mainScheduler.triggerActions();

        subscriber.assertNoValues();
    }

    @Test
    public void should_observe_repository_on_the_main_scheduler() throws Exception {
        subscriber.assertNoValues();

        ioScheduler.triggerActions();
        subscriber.assertNoValues();
        mainScheduler.triggerActions();

        subscriber.assertValue(trendingDestinations);
    }

}

如果有更好的解决方案,我正在徘徊。仅按顺序触发动作(先 io 后 main)不会涵盖我不小心使用 ioScheduler 两次的情况。此外,第二个测试也不能避免使用 mainScheduler 两次。 这个解决方案虽然保护了正确的东西,但可读性不强,并且没有告诉读者它实际上是如何测试它以测试方法的名义声明的内容。 我目前正在使用此解决方案,但如果有任何建议,我将不胜感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 2016-07-29
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多