RxJava android mvp 单元测试 NullPointerException

RxJava android mvp unit test NullPointerException

我是mvp中单元测试的新手,我想对负责登录的presenter做一个非常基本的测试,我只想断言

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

Android这里是测试代码:

@RunWith(MockitoJUnitRunner.class)
public class LoginPresenterTest {

@Mock
LoginViewContract view;
@Mock
LoginModelContract model;
@Mock
CurrentUserLoginModelContract localModel;

LoginPresenter SUT;

@Before
public void setUp() throws Exception {
    compositeDisposable = new CompositeDisposable();
    SUT = new LoginPresenter(view, model, localModel, compositeDisposable);
}

@Test
public void name() {
    LoginResponse singleResponse = new LoginResponse();

    TestScheduler testScheduler = new TestScheduler();

    when(model.loginUser(any()))
            .thenReturn(Single.just(new LoginResponse()));

    SUT.loginPres(any());
}

它只是给我 NullPointerException,我认为知道如何测试成功将帮助我测试其他所有内容,我已经阅读了有关 TestScheduler 的信息,我试过了但没有帮助,我认为我做错了什么,提前致谢。

您在测试中创建了一个 TestScheduler class,但您的 Presenter 并不知道。就像您将视图、模型、localModel 和 compositeDisposable 作为演示者的依赖项一样,您需要添加两个新的依赖项:您的 IO 调度程序(非测试代码中的 Schedulers.computation(),以及测试代码中的 new TestScheduler()测试代码)和你的 UI 调度程序(非测试代码中的 AndroidSchedulers.mainThread(),测试代码中的 new TestScheduler())。

完成后,您可以在测试代码中设置 2 个新的 TestScheduler。将它们声明为 testIoScheduler = new TestScheduler()testUiScheduler = new TestScheduler()。然后,在调用被测方法 (SUT.loginPres(any());) 之后,您可以使用 testIoScheduler.triggerActions()testUiScheduler.triggerActions()

调用调度程序

问题是你的TestScheduler。您应该创建一个助手 class 来为您的 observable 提供 schedulers。喜欢的东西:

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