Verifica interazioni negli abbonati di rxjava

Immagini la situazione in un model MVP in cui il tuo presentatore sottoscrive un servizio che restituisce un osservatore:

public void gatherData(){ service.doSomeMagic() .observeOn(Schedulers.io()) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(new TheSubscriber()); } 

Ora la class TheSubscriber chiama onNext un metodo dalla vista, ad esempio:

  • Menu overflow di Actionbar aprire / chiudere l'ascoltatore
  • Come applicare l'effetto Bass in modo programmato in android
  • MapView - Android
  • Sviluppo di giochi Android e Unity 3D
  • Perché l'emulatore Android segnala "dispositivo virtuale sconosciuto" quando il dispositivo è nella mia directory utente?
  • Come avviare una chiamata Skype da un'applicazione Android?
  •  @Override public void onNext(ReturnValue value) { view.displayWhatever(value); } 

    Ora, nel mio test dell'unità vorrei verificare che quando il metodo gatherData() viene richiamato in una situazione non errata, il metodo della visualizzazione visualizza displayWhatever(value) viene chiamato.

    La domanda :

    C'è un modo pulito per farlo?

    Sfondo :

    • Sto usando mockito per verificare le interazioni e molto più naturalmente
    • Il pugnale inietta l'integer presentatore tranne il TheSubscriber

    Cosa ho provato :

    • Iniettare l'abbonato e masticarla nei test. Sembra un po 'sporco per me, perché se voglio cambiare il modo in cui il presentatore interagisce con il servizio (Say non Rx) allora devo cambiare un sacco di test e codice.
    • Mock l'integer servizio. Questo non è stato così male, ma mi richiede di imitare molti methods e non sono riuscito a raggiungere quello che volevo.
    • Guardato in giro per internet, ma nessuno sembra avere un modo pulito e diretto di farlo

    Grazie per l'aiuto

  • Android CTS: download di CTS, impostazione dell'ambiente, costruzione e esecuzione
  • Avviare il servizio dalla notifica
  • Android URL personalizzato per aprire App come in iOS
  • Come leggere / submit i dati utilizzando la presa auricolare da 3,5 mm per Android Devices?
  • ListView - getView viene chiamato troppe volte
  • L'elemento di elenco filtrato apre l'attività originale delle voci di elenco
  • 2 Solutions collect form web for “Verifica interazioni negli abbonati di rxjava”

    Supponendo che utilizziate interfacce per il service e la view in modo simile:

     class Presenter{ Service service; View view; Presenter(Service service){ this.service = service; } void bindView(View view){ this.view = view; } void gatherData(){ service.doSomeMagic() .observeOn(Schedulers.io()) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(view::displayValue); } } 

    È quindi ansible fornire il falso per controllare e verificare il comportmento:

     @Test void assert_that_displayValue_is_called(){ Service service = mock(Service.class); View view = mock(View.class); when(service.doSomeMagic()).thenReturn(Observable.just("myvalue")); Presenter presenter = new Presenter(service); presenter.bindView(view); presenter.gatherData(); verify(view).displayValue("myvalue"); } 

    So che è abbastanza tardi ma può aiutare qualcuno, perché ho cercato abbastanza a lungo per una soluzione alla tua domanda: D

    Per me ha elaborato per aggiungere un Observable.Transformsr<T, T> come segue:

      void gatherData() { service.doSomeMagic() .compose(getSchedulerTransformsr()) .subscribe(view::displayValue); } private <T> Observable.Transformsr<T, T> getSchedulerTransformsr() { if (mTransformsr == null) { mTransformsr = (Observable.Transformsr<T, T>) observable -> observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } return mTransformsr; } void setSchedulerTransformsr(Observable.Transformsr<Observable<?>, Observable<?>> transformsr) { mTransformsr = transformsr; } 

    E per impostare il Transformsr appena appena passato questo:

     setSchedulerTransformsr(observable -> { if (observable instanceof Observable) { Observable observable1 = (Observable) observable; return observable1.subscribeOn(Schedulers.immediate()) .observeOn(Schedulers.immediate()); } return null; }); 

    Quindi basta aggiungere un metodo @Before nel tuo test e call presenter.setSchedulerTransformsr e dovrebbe essere in grado di testare questo 🙂

    spero che questo aiuti e sia in qualche modo comprensibile: D

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.