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
。
我是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
。