Ho un'attività che utilizza RxLoader per recuperare i dati dal server al momento della creazione dell'attività e popola una visualizzazione elenco. Ho anche il codice di prova che tenta di fare clic sulla prima riga della visualizzazione elenco dopo che è stata popolata.Test Espresso con RxLoader
Poiché sto utilizzando RxLoader, devo scrivere un IdlingResource personalizzato per Espresso. Tuttavia, il problema è che il test finisce (fallisce) prima che il mio listview venga popolato.
Ecco il mio codice di attività:
RxLoaderManager.get(this).create(
"my_loader",
mRestService.loadData(),
new RxLoaderObserver<MyData>() {
@Override
public void onNext(MyData data) {
// populate listview with data here
...
}
});
Qui è la mia realizzazione IdlingResource:
public class IdlingApiServiceWrapper implements IdlingResource {
public Observable<MyData> loadData(){
counter.incrementAndGet();
Observable<MyData> observable = api.loadData().finallyDo(new Action0() {
@Override
public void call() {
counter.decrementAndGet();
notifyIdle();
}
});
return observable;
} }
Il problema è che: Quando eseguo il codice di prova, il metodo "counter.decrementAndGet()" viene sempre chiamato prima del metodo "onNext()" nella mia attività. Il mio test fallisce perché prevede di essere popolato da listview.
A quanto pare sto facendo qualcosa di sbagliato. Ma cosa sto sbagliando?
UPDATE:
Ecco un frammento di codice più pulito per illustrare il problema:
RxLoaderManager.get(this).create(
"my_loader",
myObservable.finallyDo(new Action0() {
@Override
public void call() {
//log
}
}),
new RxLoaderObserver<MyData>() {
@Override
public void onNext(MyData data) {
// do something here
}
}).start();
Nel codice di cui sopra, lo snippet di codice finallyDo() viene chiamato prima della "onNext()" chiamata dell'osservatore. FinallyDo() dovrebbe essere chiamato dopo "onNext()"?