如何为单元测试选择正确的调度程序
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())
我有以下代码要测试:
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())