【问题标题】:RxJava android mvp unit test NullPointerExceptionRxJava android mvp 单元测试 NullPointerException
【发布时间】:2019-12-04 23:40:20
【问题描述】:

我是mvp单元测试的新手,我想对负责登录的演示者做一个verrry基本测试,我只想断言

view.onLoginSuccess();

这是 PresenterCode:

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 的信息,我尝试过但没有帮助,我认为我做错了什么,谢谢前进。

【问题讨论】:

标签: java android unit-testing rx-java


【解决方案1】:

问题是你的TestScheduler。您应该创建一个助手类来为您的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

【讨论】:

    【解决方案2】:

    您在测试类中创建了一个 TestScheduler,但您的 Presenter 不知道它。就像您将视图、模型、localModel 和compositeDisposable 作为presenter 的依赖项一样,您需要添加两个新的依赖项:您的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() 调用调度程序

    【讨论】:

    • 对不起,我刚刚阅读了关于我的问题的你的 cmets,真的很抱歉刚刚看到他们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多