Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava android mvp单元测试NullPointerException_Java_Android_Unit Testing_Rx Java - Fatal编程技术网

RxJava android mvp单元测试NullPointerException

RxJava android mvp单元测试NullPointerException,java,android,unit-testing,rx-java,Java,Android,Unit Testing,Rx Java,我不熟悉mvp中的单元测试,我想对演示者做一个非常基本的测试,演示者负责登录,我只想在上面断言 view.onLoginSuccess(); 以下是演示者代码: public LoginPresenter(LoginViewContract loginView, LoginModelContract loginModel, CurrentUserLoginModelContract currentUserL

我不熟悉mvp中的单元测试,我想对演示者做一个非常基本的测试,演示者负责登录,我只想在上面断言

view.onLoginSuccess();
以下是演示者代码:

public LoginPresenter(LoginViewContract loginView,
                      LoginModelContract loginModel,
                      CurrentUserLoginModelContract currentUserLoginModel,
                      CompositeDisposable subscriptions) {

    this.subscriptions = subscriptions;

    this.loginView = loginView;

    this.loginModel = loginModel;

    this.currentUserLoginModel = currentUserLoginModel;
}

@Override
public void loginPres(LoginRequest loginRequest) {
    loginModel.loginUser(loginRequest)
        .subscribeOn(Schedulers.computation())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new SingleObserver<LoginResponse>() {

            @Override
            public void onSubscribe(Disposable d) {
                subscriptions.add(d);
            }

            @Override
            public void onSuccess(LoginResponse loginResponse) {
            //  do something with the response
                loginView.loginSuccessMessage(token, true);
            }

            @Override
            public void onError(Throwable e) {
                loginView.loginFailedErrorMessage();
                Timber.e(e, "Error while trying to login");
            }
        });
}

它只是给了我NullPointerException,我认为知道如何测试成功将帮助我测试其他一切,我已经阅读了关于TestScheduler的文章,我尝试了它,但没有帮助,我认为我做错了什么,提前感谢。

您在测试类中制作了一个TestScheduler,但您的演示者不知道它。正如您可以将视图、模型、本地模型和CompositeDiscovery作为演示者的依赖项一样,您需要添加两个新的依赖项:非测试代码中的IO调度程序(
Schedulers.computation()
),以及测试代码中的
new TestScheduler()
)和UI调度程序(
AndroidSchedulers.mainThread()
在非测试代码中,以及
在测试代码中新建TestScheduler()


一旦您这样做了,您就可以在测试代码中设置2个新的测试调度器。将它们声明为
testoscheduler=newtestscheduler()
testUiScheduler=newtestscheduler()
。然后,在调用被测试的方法(
SUT.loginPres(any());
)之后,就可以使用
testoscheduler.triggerations()
testUiScheduler.triggerations()
调用调度程序,问题在于
TestScheduler
。您应该创建一个帮助器类,为您的
可观察的
提供
调度程序。比如:

class RxProvider{
     fun provideIOScheduler()
     fun provideAndroidMainScheduler()
}

//Then you can call the rxprovider inside your presenter:
loginModel.loginUser(loginRequest)
    .subscribeOn(rxProvider.provideIOScheduler())
    .observeOn(rxProvider.provideAndroidMainScheduler())
// inside your test cases
when(rxProvider....).thenReturn(testSchedulers)

p/s:1更多提示,你应该嘲笑你的
LoginResponse
,而不是到处调用
new

你看过这个吗:也许有帮助吗?你能发布例外情况吗?对不起,我刚刚读了你对我的问题的评论,真的很抱歉刚刚看到它们
class RxProvider{
     fun provideIOScheduler()
     fun provideAndroidMainScheduler()
}

//Then you can call the rxprovider inside your presenter:
loginModel.loginUser(loginRequest)
    .subscribeOn(rxProvider.provideIOScheduler())
    .observeOn(rxProvider.provideAndroidMainScheduler())
// inside your test cases
when(rxProvider....).thenReturn(testSchedulers)