【问题标题】:RxJava and unit testing with mockitoRxJava 和使用 mockito 进行单元测试
【发布时间】:2017-09-19 10:15:24
【问题描述】:

我想测试我的 Presenter

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?

【问题讨论】:

  • 您的 MainPresenter 是否有任何外部的非 void 方法?如果你想测试 Presenter 的行为,你需要一个事件流,比如 LoadingDataFailedEvent,如果模拟存储库返回 Obs.error(),你可以从外部订阅并测试它。
  • 谢谢你的回答,汉斯。我发布了我的整个 Presenter,我只有 void 方法。不明白,说实话。有没有机会,您能否编写示例代码,发布任何开源代码的链接或解释您的意思的文章?

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


【解决方案1】:
  1. 这些测试场景看起来很合理。

  2. 让测试覆盖对象的公共表面通常是一种好习惯,但鉴于MainPresenter 的当前实现,测试detachView() 清除disposables 可能会很棘手。

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

如果您需要更多地控制异步的具体时间,TestScheduler 可以让(seen here) 变得非常简单。

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多