我正在写一个单元测试和需要模拟 Observable
(从改造)
已通过测试的组件中的代码如下所示︰
getApiRequestObservable()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(...)
在单元测试中 (针对 JVM 所以 AndroidSchedulers
不可用) 我需要使它所有同步,所以我的测试中将看起来像︰
@Test
public void testSomething() {
doReturn(mockedResponse).when(presenter).getApiRequestObservable();
presenter.callApi();
verify(object,times(1)).someMethod();
}
要做到这一点,我在应该登记钩 setup () 方法︰
@Before
public void setUp() throws Exception {
// AndroidSchedulers.mainThread() is not available here so we fake it with this hook
RxAndroidPlugins.getInstance().registerSchedulersHook(new RxAndroidSchedulersHook() {
@Override
public Scheduler getMainThreadScheduler() {
return Schedulers.immediate();
}
});
// We want synchronous operations
RxJavaPlugins.getInstance().registerSchedulersHook(new RxJavaSchedulersHook(){
@Override
public Scheduler getIOScheduler() {
return Schedulers.immediate();
}
});
}
但是,这将引发上述例外情况,因为我显然不允许注册两个挂钩。有任何的解决办法吗?
问题是,你不重置测试状态 — — 您可以通过运行单个测试验证。要解决您特定的问题,你需要到 reset
rx 插件状态如下所示︰
@Before
public void setUp(){
RxJavaPlugins.getInstance().reset();
RxAndroidPlugins.getInstance().reset();
//continue setup
...
}
你甚至可以包装重置为可重用 @Rule
由亚历克西斯 Mas 博客文章所述︰
public class RxJavaResetRule implements TestRule {
@Override
public Statement apply(Statement base, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
//before: plugins reset, execution and schedulers hook defined
RxJavaPlugins.getInstance().reset();
RxAndroidPlugins.getInstance().reset();
// register custom schedulers
...
base.evaluate();
}
};
}
}