2016-09-20 17 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(); 
      } 
     }); 
    } 

しかし、私は明らかに2つのフックを登録することが許されておりませんので、これは上記の例外がスローされます。その周りには何か方法はありますか?

答えて

4

問題は、テストの状態をリセットしていないことです.1回のテストを実行することで確認できます。 Alexis Mas blog postで説明したよう

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

は、あなたも、再利用可能な@Ruleにリセットをラップすることができます:あなたの特定の問題を解決するには、そのようにreset RXプラグインの状態必要

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