繁体   English   中英

RxJava:如何单元测试 Observable 在正确的调度程序上被观察和订阅?

[英]RxJava: How to unit test that an Observable is observed on and subscribed on the right scheduler?

我有以下场景:

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

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

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

@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 两次。 这个解决方案,虽然防御正确的事情,但不是很可读,并且没有告诉读者它实际上是如何测试它在测试方法名称中声明的内容。 我现在正在使用这个解决方案,但希望得到任何建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM