【问题标题】:Threading issue when testing (Rx Java)测试时的线程问题(Rx Java)
【发布时间】:2017-03-08 12:40:49
【问题描述】:

在此之前,我正在观看一些关于切换到 MVP、RX Java 和编写测试的视频……所以基本上是 TDD……无论如何,为那个演示者编写这些演示者和测试的人遇到了问题。

这就是他们所做的。他们使用 Rx Java 从数据库返回 Observables,在他们的 Presenter 中他们有方法,他们调用操作符 .subscribeOn(Schedulers.io) 和 .observeOn(AndroidSchedulers.mainThread)

所以测试失败了,因为它在一个线程上运行,有时视图上的方法(在 mainThread 上)没有被调用......我不太理解......也许有人知道我想要什么说

我的问题是,你能这样做吗(它是否解决了问题)? 这是我的主持人的方法:

@Override
    public void getRandomJoke() {
        mJokeView.showProgress();
        jokeInteractor.getRandomJoke()
                .subscribe(new Observer<RandomJokeResponse>() {
                @Override
                public void onCompleted() {
                    mJokeView.hideProgress();
                    mJokeView.showJoke(mJoke);
                }

                @Override
                public void onError(Throwable e) {
                    mJokeView.hideProgress();
                    mJokeView.showError(e.getMessage());
                }

                @Override
                public void onNext(RandomJokeResponse randomJokeResponse) {
                    if (randomJokeResponse != null) {
                        mJokeView.hideProgress();
                        mJoke = randomJokeResponse.getJokeData().getJoke();
                    }
                }
            });

}

然后我将这两个运算符放在我的交互器中:

    @Override
    public Observable<RandomJokeResponse> getRandomJoke() {
        return retrofitService.getRandomJoke()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }

我还没有写测试,刚开始看视频并看到了那个问题,所以现在我想知道这样做是否是个好主意,因为我听说你不应该有任何与演示者内部的 Android...因为测试...

【问题讨论】:

  • 这对我来说看起来不错。你测试过吗?顺便说一句,检查这一行 if (randomJokeResponse != null),也许 randomJokeResponse 永远不会为空,它只是防御性编程(不好的做法)
  • Tnx! ..它不应该为空,因为这是可观察的,你没有拉,所以如果它有响应,你会得到它,对吧? ...我仍然没有写一行测试:) 刚开始看视频,我看到人们在演示者中遇到了线程问题。他们修复它的方法是将调度程序从活动传递给演示者,并在测试中使用 Schedulers.trampoline 在之前的注释中。不太确定是什么问题,所以我想问一下是否有人知道那里的问题以及我的解决方案是否解决了该问题
  • 没错,如果您使用改造,它永远不会发出空值。问题是网络访问应该在io 线程中,并且更改de UI 应该在mainThread 中,但是在测试中您可能没有Android 线程(它不是Android 测试),因此您需要将工作排入队列,而不是将其委托给主(Android)线程。
  • 没错,这是个好办法
  • 很高兴听到这个消息! :) tnx!

标签: android unit-testing mvp rx-android rx-java2


【解决方案1】:

我过去常常将我的调度程序作为我的 Presenter 内部的外部依赖项,这样我就可以在我的测试中注入 Schedulers.immediate(),这样它们就会同步执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    相关资源
    最近更新 更多