Android 测试包含CompositeDisposable的演示者
我尝试为我的presenter类创建单元测试,该类使用RxJava CompositeDisposable,但它总是给出空指针异常 这是我的演示者课程:Android 测试包含CompositeDisposable的演示者,android,unit-testing,kotlin,mockito,rx-java2,Android,Unit Testing,Kotlin,Mockito,Rx Java2,我尝试为我的presenter类创建单元测试,该类使用RxJava CompositeDisposable,但它总是给出空指针异常 这是我的演示者课程: class LastMatchPresenter(val mView : MatchContract.View, val matchRepositoryImpl: MatchRepositoryImpl, val scheduler: SchedulerPro
class LastMatchPresenter(val mView : MatchContract.View,
val matchRepositoryImpl: MatchRepositoryImpl,
val scheduler: SchedulerProvider) : MatchContract.Presenter{
val compositeDisposable = CompositeDisposable()
override fun getFootballMatchData() {
mView.showLoading()
compositeDisposable.add(matchRepositoryImpl.getFootballMatch("4328")
.observeOn(scheduler.ui())
.subscribeOn(scheduler.io())
.subscribe{
mView.displayFootballMatch(it.events)
mView.hideLoading()
})
}
}
这是测试类:
class LastMatchPresenterTest {
@Mock
lateinit var mView: MatchContract.View
@Mock
lateinit var matchRepositoryImpl: MatchRepositoryImpl
lateinit var scheduler: SchedulerProvider
lateinit var mPresenter: LastMatchPresenter
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
scheduler = TestSchedulerProvider()
mPresenter = LastMatchPresenter(mView, matchRepositoryImpl, scheduler)
}
@Test
fun getFootballMatchData() {
mPresenter.getFootballMatchData()
mView.showLoading()
}
}
当我运行测试时,它给了我以下错误:
java.lang.NullPointerException
at com.rahmat.app.footballclub.feature.lastmatch.LastMatchPresenter.getFootballMatchData(LastMatchPresenter.kt:20)
at com.rahmat.app.footballclub.feature.lastmatch.LastMatchPresenterTest.getFootballMatchData(LastMatchPresenterTest.kt:43)
其中指出:
这一行
.observeOn(scheduler.ui())
我不知道这是否能帮助您
但是当我有一个Presenter和PresenterTest时,我会给你一些代码
演示者:
...
private void loadRepos() {
disposableManager.add(repoRepository.getTrendingRepos()
.doOnSubscribe(__ -> viewModel.loadingUpdated().accept(true))
.doOnEvent((d, t) -> viewModel.loadingUpdated().accept(false))
.doOnSuccess(__ -> viewModel.reposUpdated().run())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(dataSource::setData, viewModel.onError()));
}
...
public class TrendingReposPresenterTest {
static {
RxAndroidPlugins.setInitMainThreadSchedulerHandler(schedulerCallable -> Schedulers.trampoline());
}
...
private void initializePresenter() {
presenter = new TrendingReposPresenter(viewModel, repoRepository,
screenNavigator,Mockito.mock(DisposableManager.class),dataSource);
}
我观察主线程中的更改,但在测试中我更改了调度程序以运行它
在PresenterTest中,我添加了这个来运行测试
演示者测试:
...
private void loadRepos() {
disposableManager.add(repoRepository.getTrendingRepos()
.doOnSubscribe(__ -> viewModel.loadingUpdated().accept(true))
.doOnEvent((d, t) -> viewModel.loadingUpdated().accept(false))
.doOnSuccess(__ -> viewModel.reposUpdated().run())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(dataSource::setData, viewModel.onError()));
}
...
public class TrendingReposPresenterTest {
static {
RxAndroidPlugins.setInitMainThreadSchedulerHandler(schedulerCallable -> Schedulers.trampoline());
}
...
private void initializePresenter() {
presenter = new TrendingReposPresenter(viewModel, repoRepository,
screenNavigator,Mockito.mock(DisposableManager.class),dataSource);
}
这是我的一次性管理器类,用于处理可观察对象
可处置经理人
public class DisposableManager {
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
public void add(Disposable... disposables) {
compositeDisposable.addAll(disposables);
}
public void dispose() {
compositeDisposable.clear();
}
}
我希望这对你有帮助。但是我不确定这是否是你的问题我不知道这是否能帮助你 但是当我有一个Presenter和PresenterTest时,我会给你一些代码 演示者:
...
private void loadRepos() {
disposableManager.add(repoRepository.getTrendingRepos()
.doOnSubscribe(__ -> viewModel.loadingUpdated().accept(true))
.doOnEvent((d, t) -> viewModel.loadingUpdated().accept(false))
.doOnSuccess(__ -> viewModel.reposUpdated().run())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(dataSource::setData, viewModel.onError()));
}
...
public class TrendingReposPresenterTest {
static {
RxAndroidPlugins.setInitMainThreadSchedulerHandler(schedulerCallable -> Schedulers.trampoline());
}
...
private void initializePresenter() {
presenter = new TrendingReposPresenter(viewModel, repoRepository,
screenNavigator,Mockito.mock(DisposableManager.class),dataSource);
}
我观察主线程中的更改,但在测试中我更改了调度程序以运行它
在PresenterTest中,我添加了这个来运行测试
演示者测试:
...
private void loadRepos() {
disposableManager.add(repoRepository.getTrendingRepos()
.doOnSubscribe(__ -> viewModel.loadingUpdated().accept(true))
.doOnEvent((d, t) -> viewModel.loadingUpdated().accept(false))
.doOnSuccess(__ -> viewModel.reposUpdated().run())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(dataSource::setData, viewModel.onError()));
}
...
public class TrendingReposPresenterTest {
static {
RxAndroidPlugins.setInitMainThreadSchedulerHandler(schedulerCallable -> Schedulers.trampoline());
}
...
private void initializePresenter() {
presenter = new TrendingReposPresenter(viewModel, repoRepository,
screenNavigator,Mockito.mock(DisposableManager.class),dataSource);
}
这是我的一次性管理器类,用于处理可观察对象
可处置经理人
public class DisposableManager {
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
public void add(Disposable... disposables) {
compositeDisposable.addAll(disposables);
}
public void dispose() {
compositeDisposable.clear();
}
}
我希望这对你有帮助。但我不确定这是否是您的问题matchRepositoryImpl.getFootballMatch(“4328”)可能返回null。您模拟了matchRepositoryImpl,但没有为此模拟getFootballMatch方法。这是很快猜到的
顺便说一句,如果您使用Kotlin进行测试,我建议您尝试Mock。getFootballMatch(“4328”)可能返回null。您模拟了matchRepositoryImpl,但没有为此模拟getFootballMatch方法。这是很快猜到的
顺便说一句,如果您使用Kotlin进行测试,我建议您尝试MockK,您必须模拟
matchRepositoryImpl.getFootballMatch(“4328”)
这样的方法:
Mockito.`when`(matchRepositoryImpl.getFootballMatch("4328"))
.thenReturn(Observable.just(OBJECT_YOU_WANT_TO_BE_RETURNED))
您可以在块之前,或在特定测试中,将此模拟放入
。您必须模拟matchRepositoryImpl.getFootballMatch(“4328”)
方法,如下所示:
Mockito.`when`(matchRepositoryImpl.getFootballMatch("4328"))
.thenReturn(Observable.just(OBJECT_YOU_WANT_TO_BE_RETURNED))
您可以将此模拟置于
块之前的@中,或者在特定的测试中。我可以查看您的DisposableManager类吗?我可以查看您的DisposableManager类吗?getFootballMatch return可流对象,我尝试使用“when”“thenReturn”,但仍然出现相同的错误。你有什么建议来模拟这个方法吗?getFootballMatch返回可流动对象,我试图使用“when”“thenReturn”,但它仍然给了我同样的错误。你有什么建议来嘲笑这种方法吗?