dimanche 8 janvier 2017

UnitTesting RxJava Methods

I am working with MVP+RxJava and I want to create tests to verify if the API is working correctly and if the messages are being displayed. But I am getting the exception:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
ScalarSynchronousObservable cannot be returned by getApi()

My code:

public class CarService {

    private static final String CARSERVER_URL = "URL";
    private CarApi mCarApi;

    public CarService() {


        RequestInterceptor requestInterceptor = new RequestInterceptor() {
            @Override
            public void intercept(RequestFacade request) {
                request.addHeader("Accept", "application/json");
            }
        };

        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(USER_SERVER_URL )
                .setRequestInterceptor(requestInterceptor)
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();

        mCarApi = restAdapter.create(CarApi.class);
    }

    public CarApi getApi() {

        return mCarApi;
    }

    public interface CarApi {

        @GET("/cars")
        public Observable<List<Car>>
            getCars();

    }
}


public class MyPresenter {

     public void loadCars(){
            mView.showProgress();

            mCar.getApi()
                        .getCars()
                        .subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Observer<List<Car>>() {
                            @Override
                            public void onCompleted() {
                                mView.hideProgress();
                            }

                            @Override
                            public void onError(Throwable e) {
                                mView.showCantFetchApiError(R.string.error_cant_fetch_api);
                            }

                            @Override
                            public void onNext(List<Car> cars) {
                                mView.displayCars(cars);
                            }

                        });

    }

MyTest Class:

  @RunWith(MockitoJUnitRunner.class)
 public class ListPresenterTest {

    @Before
    public void setUp() throws Exception {
        mUserService = Mockito.spy(new UserService());
        mUserPresenter = new ListPresenter(mListUserView, mUserService);

            // Override RxJava schedulers
        RxJavaHooks.setOnIOScheduler(new Func1<Scheduler, Scheduler>() {
            @Override
            public Scheduler call(Scheduler scheduler) {
                return Schedulers.immediate();
            }
        });

        RxJavaHooks.setOnComputationScheduler(new Func1<Scheduler, Scheduler>() {
            @Override
            public Scheduler call(Scheduler scheduler) {
                return Schedulers.immediate();
            }
        });

        RxJavaHooks.setOnNewThreadScheduler(new Func1<Scheduler, Scheduler>() {
            @Override
            public Scheduler call(Scheduler scheduler) {
                return Schedulers.immediate();
            }
        });

            // Override RxAndroid schedulers
        final RxAndroidPlugins rxAndroidPlugins = RxAndroidPlugins.getInstance();
        rxAndroidPlugins.registerSchedulersHook(new RxAndroidSchedulersHook() {
            @Override
            public Scheduler getMainThreadScheduler() {
                return Schedulers.immediate();
            }
        });
    }


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

    @Test


    public void shouldApiWorking() throws Exception {
       when(mUserService.getApi().getUsers()).thenReturn(rx.Observable.just(Collections.<User>emptyList()));
        // already tried this:
        //        doReturn(rx.Observable.just(Collections.<User>emptyList())).when(mUserService.getApi().getUsers());
       mUserPresenter.getUsers();
       verify(mListUserView).showNoUsersError(R.string.error_no_users);

   }
}

Aucun commentaire:

Enregistrer un commentaire