Android 使用RxJava执行单元测试时获取NullPointerException
我有一个login presenter类,想对它进行单元测试 这就是login presenter类的外观:Android 使用RxJava执行单元测试时获取NullPointerException,android,unit-testing,mockito,rx-java2,android-testing,Android,Unit Testing,Mockito,Rx Java2,Android Testing,我有一个login presenter类,想对它进行单元测试 这就是login presenter类的外观: public class LoginPresenter<V extends LoginMvpView> extends BasePresenter<V> implements LoginMvpPresenter<V> { @Inject public LoginPresenter(DataManager dataMa
public class LoginPresenter<V extends LoginMvpView> extends BasePresenter<V>
implements LoginMvpPresenter<V> {
@Inject
public LoginPresenter(DataManager dataManager,
SchedulerProvider schedulerProvider,
CompositeDisposable compositeDisposable) {
super(dataManager, schedulerProvider, compositeDisposable);
}
@Override
public void onAttach(V mvpView) {
super.onAttach(mvpView);
}
@Override
public void login(String email, String password) {
getMvpView().hideKeyboard();
LoginRequest request = new LoginRequest();
request.setEmail(email);
request.setPassword(password);
if(email == null || email.length() == 0){
getMvpView().onError(R.string.msg_pls_fill_email);
return;
}
if(password == null || password.length() == 0){
getMvpView().onError(R.string.msg_pls_fill_password);
return;
}
getMvpView().showLoading();
getCompositeDisposable().add(getDataManager()
.login(request)
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe(response -> {
if (!isViewAttached()) {
return;
}
getMvpView().openMainActivity();
}, throwable -> {
if (!isViewAttached()) {
return;
}
getMvpView().hideLoading();
getMvpView().onError(R.string.api_default_error);
})
);
}
}
我在运行测试时遇到此错误:
java.lang.NullPointerException
at com.logab.customerui.login.LoginPresenter.login(LoginPresenter.java:85)
at com.logab.customer.ui.login.LoginPresenterTest.testServerLoginSuccess(LoginPresenterTest.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
....
....
...
[MockitoHint] LoginPresenterTest.testServerLoginSuccess (see javadoc for MockitoHint):
[MockitoHint] 1. Unused... -> at com.logap.customer.ui.login.LoginPresenterTest.testServerLoginSuccess(LoginPresenterTest.java:60)
[MockitoHint] ...args ok? -> at com.logap.customer.ui.login.LoginPresenter.login(LoginPresenter.java:84)
跟踪该错误将转到此行:
.subscribeOn(getSchedulerProvider().io())
注意:我使用dagger2提供依赖项
有人能帮忙吗?谢谢。您的代码为此行抛出一个
NullPointerException
getDataManager().login(request)
.subscribeOn(getSchedulerProvider().io())
因为它与登录方法调用的参数不匹配
您必须调整测试,例如:(使用
ArgumentMatcher
的eq
)
使用matcher(假设LoginRequest对象的等于
和hashcode
实现正确)应该可以解决您的问题
或者,如果不需要参数的精确匹配,
您也可以使用
any(LoginRequest.class)
。对不起,我刚刚更新了代码。它应该在没有帐户参数的情况下登录(请求)。在这种情况下,您仍然必须使用ArgumentMatcher.eq
方法来模拟登录调用。-相应地更新了答案
.subscribeOn(getSchedulerProvider().io())
getDataManager().login(request)
.subscribeOn(getSchedulerProvider().io())
doReturn(Single.just(loginResponse))
.when(mMockDataManager)
.login(eq(new LoginRequest(email, password)));