簡體   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