簡體   English   中英

RxJava android mvp單元測試NullPointerException

[英]RxJava android mvp unit test NullPointerException

我是mvp中的單元測試的新手,我想對演示者做一個基本的測試,負責進行登錄,我只想斷言

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,我試過但沒有幫助,我想我做錯了什么,提前謝謝。

您在測試類中創建了一個TestScheduler,但您的Presenter並不了解它。 就像您將視圖,模型,localModel和compositeDisposable視為演示者的依賴關系一樣,您需要添加兩個新的依賴項:您的IO調度Schedulers.computation()非測試代碼中的Schedulers.computation()和測試中的new TestScheduler()代碼)和您的UI調度程序(非測試代碼中的AndroidSchedulers.mainThread()和測試代碼中的new TestScheduler() )。

完成后,您可以在測試代碼中設置2個新的TestSchedulers。 將它們聲明為testIoScheduler = new TestScheduler()testUiScheduler = new TestScheduler() 然后,在調用測試中的方法( SUT.loginPres(any()); )之后,您可以使用testIoScheduler.triggerActions()testUiScheduler.triggerActions()調用調度程序。

問題是你的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 ,你應該模擬你的LoginResponse而不是到處調用new

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM