[英]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.