RxJava android mvp单元测试NullPointerException
我不熟悉mvp中的单元测试,我想对演示者做一个非常基本的测试,演示者负责登录,我只想在上面断言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
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)