Unit testing RxJava和mockito单元测试

Unit testing RxJava和mockito单元测试,unit-testing,mockito,tdd,rx-java,mosby,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)

我想测试我的演讲者

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();
        }
    }
}
2) 我应该为detachView(布尔保留)和clear disposables编写测试吗

3) 在我的例子中,什么样的机制最适合测试RxJava

  • 这些测试场景似乎是合理的

  • 让测试覆盖对象的公共表面通常是一种很好的做法,但是考虑到
    MainPresenter
    的当前实现,测试
    detachView()
    清除
    可处置的
    可能很棘手

  • 您可以为
    Repository
    创建存根,当调用
    GetCountries()
    时,该存根返回一个可观察的返回值。您可以分别使用
    Observable.return()
    Observable.error()
    来创建成功和失败的可观察对象


  • 如果您需要更多地控制异步的特定时间,
    TestScheduler
    使它变得非常简单。

    您的MainPresenter是否有任何非无效的外部方法?如果您想测试演示者的行为,您需要一个事件流,如LoadingDataFailedEvent,如果模拟存储库返回Obs.error(),您可以从外部订阅并测试它。谢谢您的回答,Hans。我发布了我的整个演示者,我只有无效的方法。老实说,我不明白。顺便问一下,您是否可以编写示例代码,发布任何开源代码或文章的链接来解释您的意思?
    shouldShowContentWhenLoadFromRepository()
    shouldShowErrorWhenLoadFromRepository()
    shouldShowContentWhenLoadFromRemoteDatastore()
    shouldShowErrorWhenLoadFromRemoteDatastore()