Android 测试时的线程问题(Rx Java)

Android 测试时的线程问题(Rx Java),android,unit-testing,mvp,rx-android,rx-java2,Android,Unit Testing,Mvp,Rx Android,Rx Java2,在那之前我看了一些关于切换到MVP、RxJava和编写测试的视频。。。所以基本上是TDD。。不管怎么说,为那个演示者编写演示者和测试的人有一个问题 这就是他们所做的。他们使用RXJava从数据库返回观测值,在他们的演示程序中,他们有这个方法,并调用operators.subscribeOn(Schedulers.io)和.observeOn(AndroidSchedulers.mainThread) 所以测试失败了,因为它在一个线程上运行,有时视图上的方法(在主线程上)没有被调用。。。我不太明白

在那之前我看了一些关于切换到MVP、RxJava和编写测试的视频。。。所以基本上是TDD。。不管怎么说,为那个演示者编写演示者和测试的人有一个问题

这就是他们所做的。他们使用RXJava从数据库返回观测值,在他们的演示程序中,他们有这个方法,并调用operators.subscribeOn(Schedulers.io)和.observeOn(AndroidSchedulers.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();
                    }
                }
            });

}
@覆盖
公开作废{
mJokeView.showProgress();
jokeInteractor.getRandomJoke()
.订阅(新观察员){
@凌驾
未完成的公共无效(){
mJokeView.hideProgress();
mJokeView.showJoke(mJoke);
}
@凌驾
公共无效申报人(可丢弃的e){
mJokeView.hideProgress();
mJokeView.bathror(如getMessage());
}
@凌驾
public void onNext(randomjokerresponse randomjokerresponse){
if(randomJokerResponse!=null){
mJokeView.hideProgress();
mJoke=randomJokeResponse.getJokeData().getJoke();
}
}
});
}
我把这两个操作符放在我的交互器中:

    @Override
    public Observable<RandomJokeResponse> getRandomJoke() {
        return retrofitService.getRandomJoke()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }
@覆盖
公众可观察的{
return.service.getRandomJoke()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}

我还没有写测试,只是开始看视频,看到了这个问题,所以现在我想知道这样做是不是一个好主意,因为我听说你的演示程序中不应该有任何与Android相关的东西…因为测试…

我习惯于在演示程序中将我的调度程序作为外部依赖项,这样我就可以在我的测试中插入
调度程序.immediate()
,这样它们就可以同步执行。

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