Android 使用RxJava执行单元测试时获取NullPointerException

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

我有一个login presenter类,想对它进行单元测试

这就是login presenter类的外观:

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)));