PlenProgramModel { @NonNull public Observable<Void> fetch() { return processFetchRequest() .doOnNext(response -> { mMotionCategories.set(response.categories); mSequence.set(response.sequence); }) .doOnError(e -> Log.e(TAG, "fetch error")) .doOnCompleted(() -> Log.i(TAG, "fetch complete")) .flatMap(r -> Observable.<Void>empty()); } protected  PlenProgramModel(@NonNull Context context); void open(@NonNull File programDirectory); @NonNull static PlenProgramModel create(@NonNull Context context); @NonNull Property<List<PlenCodeUnit>> sequence(); @NonNull ReadOnlyProperty<List<PlenMotionCategory>> motionCategories(); @NonNull ReadOnlyProperty<PlenProgram> program(); @NonNull Observable<Void> fetch(); @NonNull Observable<Void> push();  }
@Test public void testFetch() throws Exception { PlenProgramModel model = PlenProgramModel.create(mContext, mMotionsFile, mSequenceFile); model.fetch().observeOn(AndroidSchedulers.mainThread()) .subscribe(v -> Log.d(TAG, "ok")); }