我有以下代码要测试:

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())

最佳答案

这是因为myTest不知道有东西在另一个线程上运行,所以它继续在可观察的返回之前运行断言。
使用RxJavaHooks在单元测试中检测IO调度程序返回立即调度程序。
例如:RxJavaHooks.setOnIOScheduler(scheduler -> Schedulers.immediate())

关于android - 如何为单元测试选择正确的调度程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39124164/

10-08 22:31
查看更多