2016-09-13 6 views
1

私は、次のシナリオがあります。今、私はユニットテストしたいsubscribeOnobserveOnが正しいScheduler Sを使用して呼び出されることRxJava:オブザーバブルが観測され、正しいスケジューラに登録されていることをユニットテストする方法は?

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

を。

+0

RxJavaのgithubページでもこの問題が発生しました。https://github.com/ReactiveX/RxJava/issues/4532 –

答えて

1

次のように私はそれが2つのユニットテストを書いていたんでした方法:よりよい解決策があるかどう

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

} 

私はさまよいました。単にioSchedulerを2度使用した場合は、最初にioを実行し、次にmainを実行するだけで、アクションをトリガすることはできません。また、2回目のテストでも、mainSchedulerの使用を2回も防御していません。 このソリューションは、適切なものに対して防御していますが、読みにくくはなく、実際にテストメソッドの名前でどのような状態がテストされているかを読者に伝えません。 私は今このソリューションを使用していますが、何か提案があれば幸いです。

関連する問題