【问题标题】:How to choose the right scheduler for unit-tests如何为单元测试选择正确的调度程序
【发布时间】:2016-08-24 13:05:21
【问题描述】:

我有以下代码要测试:

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())这一行?

【问题讨论】:

    标签: android unit-testing mockito junit4 rx-java


    【解决方案1】:

    这是因为myTest 不知道有东西在另一个线程上运行,所以它会在 Observable 返回之前继续运行断言。

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

    例如:RxJavaHooks.setOnIOScheduler(scheduler -&gt; Schedulers.immediate())

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2016-07-29
      • 2017-01-20
      • 2011-12-26
      • 1970-01-01
      相关资源
      最近更新 更多