RxAndroid-java.lang.IllegalStateException︰ 另一种策略已注册

标签: Android
发布时间: 2016/10/10 21:35:01
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

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

但是,这将引发上述例外情况,因为我显然不允许注册两个挂钩。有任何的解决办法吗?

解决方法 1:

问题是,你不重置测试状态 — — 您可以通过运行单个测试验证。要解决您特定的问题,你需要到 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();
            }
        };
    }
}
赞助商