2017-01-13 11 views
1

Так у меня есть проблема, это мой ведущий код:Однако, существуют и другие взаимодействия с этим издеваться:

@Override 
public void login(String phone, String password) { 
    loginView.showProgress(); 
    compositeSubscription.clear(); 

    Subscription subscription = service.login(phone,password) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()) 
      .subscribe(data -> { 
       //Log.d("Login", new Gson().toJson(data)); 
       loginView.hideProgress(); 
       if(data.getSt()==1) 
       { 
        saveDataPartner(data.getData().getId_hos(), data.getData().getName(), data.getData().getEmail(), data.getData().getPhone(), data.getData().getAvatar()); 
        loginView.navigateToMainMenu(); 
       } 
       else { 
        loginView.showMessage(data.getMsg()); 
       } 
      }, error -> { 
       loginView.hideProgress(); 
       loginView.showMessage(ErrorUtils.getErrorMessage(error)); 
      }); 
} 

и я хочу, чтобы проверить это с помощью этого кода:

@Before 
public void setUp() throws Exception { 
    RxAndroidPlugins.getInstance().registerSchedulersHook(new RxAndroidSchedulersHook() { 
     @Override 
     public Scheduler getMainThreadScheduler() { 
      return Schedulers.immediate(); 
     } 
    }); 
} 

@After 
public void tearDown() { 
    RxAndroidPlugins.getInstance().reset(); 
} 

@Test 
public void clickBtnLogin() { 

    User user = new User(); 
    user.setName("aa"); 
    ResultAPIUser<User> ru = new ResultAPIUser<User>(); 

    ru.setData(user); 
    ru.setMsg("example message"); 
    ru.setSt(1); 

    when(service.login("aa","aa")).thenReturn(Observable.just(ru)); 

    loginPresenter.login("aa","aa"); 

    verify(loginView).showProgress(); 
    verify(loginView).hideProgress(); 
    verify(loginView).navigateToMainMenu(); 
} 

так что я установить значение st равно 1, и я думаю, что все должно быть хорошо. Но я получаю это:

Wanted but not invoked: 
loginView.hideProgress(); 
-> at  hos.wellhos.com.hosapps.login.LoginPresenterTest.clickBtnLogin(LoginPresenterTest.java:79) 

However, there were other interactions with this mock: 
loginView.setPresenter(
    [email protected] 
); 
-> at hos.wellhos.com.hosapps.login.LoginPresenter.<init> (LoginPresenter.java:43) 

Кто-нибудь может помочь мне решить эту проблему, и я думаю, что сложно проблема в этом?

ответ

0

Возможно, это проблема с резьбой. Ваш Observable подписывается на Schedulers.io Несмотря на то, что вы затем переключаетесь на основной поток, чтобы обрабатывать результаты, это потребует времени. Таким образом, ваши утверждения проверки обрабатываются до завершения подписки.

Есть несколько способов, которые вы могли бы иметь дело с этим:

Динамические Планировщики

Вместо передачи в требуемом планировщиком непосредственно к вашим subscribeOn & observeOn методами можно определить переменные-члены, которые держат это для вас:

Scheduler ioScheduler; 
Scheduler mainThreadScheduler; 

и использовать их в observeOn/subscribeOn statments:

.subscribeOn(ioScheduler) 
.observeOn(mainThreadScheduler) 

Вы можете установить их так же, как и любую другую зависимость в конструкторе класса. Для производственного кода вы должны установить их как обычный Schedulers.io() & AndroidSchedulers.mainThread() однако в вашем тестовом коде вы должны установить их как Schedulers.immediate() (который просто возвращает планировщик для текущего потока).

RxJavaHooks

Введенный в RxJava 1.1.7 есть класс Util называется RxJavaHooks, который позволяет подключить на несколько частей жизненного цикла RxJava. Одним из этих крючков является метод setOnIOScheduler(). Это позволяет вам изменить, который Scheduler возвращается Schedulers.io.

В вашем случае, если вы хотите изменить его Schedulers.immediate():

RxJavaHooks.setOnIOScheduler(scheduler -> Schedulers.immediate()); 

После того, как вы сделали тест то вам необходимо позвонить:

RxJavaHooks.reset(); 

Это просто помещает все обратно в нормальное русло так что это изменение не мешает другим тестам, которые вы запускаете в другом месте.

+0

thx, но я на самом деле реализую RxJavaHooks, как ваше решение в setUp и tearDown, я отредактирую myPost hehehe –

+0

Ха-ха, так что у вас есть. Похоже, вы только изменили mainThreadScheduler, хотя ... вы пытались добавить переопределение для Schedulers.io? – Jahnold

+0

hahaha thx для вашего ответа, как вы говорите в Dynamic Schedulers, я просто создаю класс интерфейса, и я создаю 2 класса для baseSchedulers и instantScheduller, поэтому я просто использую непосредственныйScheduller для теста, и он работает^_ ^, thx dude. Но у меня есть вопрос, почему журнал может повлиять на результат теста? поэтому, когда я раскомментирую Log.d (вы можете увидеть мой код на onNext наблюдаемого), то это вызовет onError? –

 Смежные вопросы

  • Нет связанных вопросов^_^