如何为单元测试选择正确的调度程序

How to choose the right scheduler for unit-tests

我有以下代码要测试:

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()。但是,如果我在 MyInteractor.createObservable() 中删除 subscribeOn(Schedulers.io()) 一切正常。

有没有办法让测试 运行 完成而不删除行 subscribeOn(Schedulers.io())

这是因为 myTest 没有意识到另一个线程上有东西 运行ning,所以它在 Observable returns 之前继续 运行 断言。

使用 RxJavaHooks 检测在单元测试中返回立即调度程序的 IO 调度程序。

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