2016-05-19 4 views
1

Я пытаюсь проверить это наблюдаемое для запроса на вход, но подписчики onNext и onCompleted методы никогда не вызываются.Почему мой RxJava Observable не завершен?

return mDeviceRepository.getDeviceId() 

      .flatMap(new Func1<String, Observable<LoginResponse>>() { 
       @Override 
       public Observable<LoginResponse> call(String deviceId) { 
        return mAuthRepository.login(deviceId, mUsername, mHashedPassword); 
       } 
      }) 

      .flatMap(new Func1<LoginResponse, Observable<LoginResponse>>() { 
       @Override 
       public Observable<LoginResponse> call(LoginResponse loginResponse) { 
        mSessionRepository.storeSession(UserSession.fromLoginReponse(loginResponse)); 
        mUserRepository.storeUser(loginResponse.getUser()); 
        return Observable.just(loginResponse); 
       } 
      }); 

Мой тест выглядит следующим образом:

loginUseCase.setCredentials("testuser", "testpassword"); 
when(mockDeviceRepository.getDeviceId()).thenReturn(Observable.just("testdeviceid")); 
when(mockAuthRepository.login("testdeviceid", "testuser", "testpassword")).thenReturn(Observable.just(new LoginResponse())); 

testSubscriber = new TestSubscriber(); 
loginUseCase.buildUseCaseObservable().toBlocking().subscribe(testSubscriber); 

testSubscriber.assertCompleted(); 
testSubscriber.assertValueCount(1); 

ответ

1

Как насчет assertTerminalEvent() вместо assertCompleted() в TestSubscriber? Все ваши операторы работают в одном потоке, поэтому, если утверждения TestSubscriber были достигнуты, тогда исключение было выбрано где-то в потоке

+0

У меня нет никаких NullPointers. Логин mehod заштрихован с использованием mockito: when (mockAuthRepository.login («testdeviceid», «testuser», «testpassword»)). ThenReturn (Observable.just (new LoginResponse())); – timoschloesser

+0

Вы вызываете mAuthRepository.login (deviceId, mUsername, mHashedPassword) - откуда берутся два последних аргумента? Являются ли они «testuser», «testpassword»? –

+0

Это переменные-члены класса, создающие наблюдаемый. Я инициализирую их, прежде чем приступить к методу входа в систему. Я соответствующим образом отредактировал свой вопрос. – timoschloesser

1

Попробуйте

loginUseCase.buildUseCaseObservable().subscribe(testSubscriber); 

PS: Если вы хотите, побочные эффекты, не делают их в flatMap. Используйте операторы побочных эффектов, например.

return mDeviceRepository.getDeviceId() 
     .flatMap(new Func1<String, Observable<LoginResponse>>() { 
      @Override 
      public Observable<LoginResponse> call(String deviceId) { 
       return mAuthRepository.login(deviceId, mUsername, mHashedPassword); 
      } 
     }) 
     .doOnNext(new Action1<LoginResponse>() { 
      @Override 
      public void call(String loginResponse) { 
       mSessionRepository.storeSession(UserSession.fromLoginReponse(loginResponse)); 
       mUserRepository.storeUser(loginResponse.getUser());     
      }   
     }) 
     .flatMap(new Func1<LoginResponse, Observable<LoginResponse>>() { 
      @Override 
      public Observable<LoginResponse> call(LoginResponse loginResponse) { 

       return Observable.just(loginResponse); 
      } 
     }); 
Смежные вопросы