2016-09-20 68 views
3

我寫一個單元測試和需要模擬可觀察到的(來自改型)RxAndroid - java.lang.IllegalStateException:另一種策略已經註冊

在所測試的組件中的代碼如下:

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

要做到這一點,我應該在設置()方法註冊掛鉤:

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

但是,這將引發上述異常,因爲我顯然沒有獲准註冊兩個掛鉤。有沒有辦法解決這個問題?

回答

4

問題是您沒有重置測試狀態 - 您可以通過運行單個測試來驗證。要解決您的具體問題,需要reset RX插件狀態,像這樣:

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

你甚至可以包復位到一個可重用@RuleAlexis 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(); 
      } 
     }; 
    } 
} 
相關問題