2016-09-20 3 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

문제는 테스트 상태를 다시 설정하지 않는다는 것입니다. 단일 테스트를 실행하여 확인할 수 있습니다. 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(); 
      } 
     }; 
    } 
} 
관련 문제