2016-08-24 65 views
1

我有下面的代碼進行測試:如何選擇單元測試正確的調度

public class MyInteractor implements Interactor<String, Boolean> { 

    private MyRepository repository; 

    @Inject 
    public MyInteractor(MyRepository repository) { 
     this.repository = repository; 
    } 

    @Override 
    public Observable<Boolean> createObservable(final String s) { 
     return Observable.create(new Observable.OnSubscribe<Boolean>() { 
      @Override 
      public void call(Subscriber<? super Boolean> subscriber) { 

       Boolean response = repository.call(s); 

       subscriber.onNext(response); 
       subscriber.onCompleted(); 
      } 
     }) 
       .subscribeOn(Schedulers.io()); 
    } 
} 

我寫了下面的單元測試:

@RunWith(MockitoJUnitRunner.class) 
public class MyInteractorTest { 

    @Mock 
    MyRepository repository; 

    @InjectMocks 
    MyInteractor interactor; 

    @Before 
    public void init() { 
     when(repository.call(any(String.class))) 
       .thenReturn(true); 
    } 

    @Test 
    public void myTest() throws Exception { 

     Observable<Boolean> interactorObservable = 
       interactor.createObservable("hello"); 
     TestSubscriber<Boolean> subscriber = TestSubscriber.create(); 

     interactorObservable.subscribe(subscriber); 

     subscriber.assertNoErrors(); 

     subscriber.assertCompleted(); 
     subscriber.assertReceivedOnNext(singletonList(true)); 
    } 
} 

當我運行單元測試失敗在subscriber.assertCompleted()。但是,如果我刪除subscribeOn(Schedulers.io())MyInteractor.createObservable()一切工作正常。

有沒有辦法使測試運行完成,而不是刪除行subscribeOn(Schedulers.io())

回答

1

這是因爲myTest不知道在另一個線程上運行的東西,所以它在Observable返回之前繼續運行斷言。

使用RxJavaHooks來測試IO調度程序在單元測試中返回即時調度程序。

例如:RxJavaHooks.setOnIOScheduler(scheduler -> Schedulers.immediate())

相關問題