Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 测试包含CompositeDisposable的演示者_Android_Unit Testing_Kotlin_Mockito_Rx Java2 - Fatal编程技术网

Android 测试包含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

我尝试为我的presenter类创建单元测试,该类使用RxJava CompositeDisposable,但它总是给出空指针异常

这是我的演示者课程:

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”,但它仍然给了我同样的错误。你有什么建议来嘲笑这种方法吗?