RxJava和mockito进行单元测试

时间:2017-04-22 12:22:07

标签: unit-testing mockito tdd rx-java mosby

我想测试我的演示者

public class MainPresenter extends MvpBasePresenter<MainView> {

    private Repository repository;

    private final CompositeDisposable disposables = new CompositeDisposable();

    public void setRepository(Repository repository) {
        this.repository = repository;
    }

    public void loadFromRepository() {
        getView().showLoading(false);

        disposables.add(repository.getCountries()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.newThread())
                .subscribeWith(new DisposableObserver<List<Country>>() {
                    @Override
                    public void onNext(List<Country> countries) {
                        if (isViewAttached()) {
                            getView().setData(countries);
                            getView().showContent();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        if (isViewAttached()) {
                            getView().showError(e, false);
                        }
                    }

                    @Override
                    public void onComplete() {

                    }
                }));
    }

    public void loadFromRemoteDatastore() {
        disposables.add(new RemoteDataStore().getCountries()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.newThread())
                .subscribeWith(new DisposableObserver<List<Country>>() {
                    @Override
                    public void onNext(List<Country> countries) {
                        if (isViewAttached()) {
                            getView().setData(countries);
                            getView().showContent();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        if (isViewAttached()) {
                            getView().showError(e, false);
                        }
                    }

                    @Override
                    public void onComplete() {

                    }
                }));
    }

    @Override
    public void detachView(boolean retainInstance) {
        super.detachView(retainInstance);
        if (!retainInstance) {
            disposables.clear();
        }
    }
}

但是,我有很多疑问,测试它的最佳方法是什么

1)如果我要编写这4个测试场景,这是否正常

shouldShowContentWhenLoadFromRepository()
shouldShowErrorWhenLoadFromRepository()
shouldShowContentWhenLoadFromRemoteDatastore()
shouldShowErrorWhenLoadFromRemoteDatastore()

2)我应该为detachView(boolean retainInstance)编写测试并清除一次性用品

3)在我的案例中,哪种机制最适合测试RxJava?

1 个答案:

答案 0 :(得分:0)

  1. 这些测试场景似乎合理。

  2. 让测试覆盖对象的公共表面通常是一种很好的做法,但考虑到detachView()清除disposables可能会很棘手{1}}。

  3. 您可以为MainPresenter创建一个存根,在调用Repository时返回一个Observable。您可以使用GetCountries()&amp;创建成功和不成功的Observable。分别为Observable.return()

  4. 如果您需要更多地控制异步的具体时间,Observable.error()会使其变得非常简单(seen here)