热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RxAndroid–java.lang.IllegalStateException:已经注册了另一个策略

我正在编写一个单元测试,需要模拟一个Observable(来自改造)测试组件中的代码如下:getApiRequestObservable().observeOn(AndroidSc

我正在编写一个单元测试,需要模拟一个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();
}
});
}

但这引发了上述异常,因为我显然不允许注册两个钩子.那有什么办法吗?

最佳答案:

问题是您没有重置测试状态 – 您可以通过运行单个测试来验证.要解决您的特定问题,您需要重置rx插件状态,如下所示:

@Before
public void setUp(){
RxJavaPlugins.getInstance().reset();
RxAndroidPlugins.getInstance().reset();
//continue setup
...
}

您甚至可以将重置包装到可重用的@Rule中,如Alexis Mas blog post所述:

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


推荐阅读
author-avatar
ebt1775010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有