我有以下代码要测试:
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/