【问题标题】:Why does the view methods does not get called inside an Observable which is inside the presenter on a unit test?为什么在单元测试的演示者内部的 Observable 内部不会调用视图方法?
【发布时间】:2018-10-04 06:12:07
【问题描述】:

我是 Android 单元测试的新手,我们目前正在使用 MVP+RxJava+Dagger 2。我编写的这个测试在单元测试中失败,但在生产代码中有效:

@Override
public void retrieveListOfBillers() {
    getMvpView().showLoading();
    getCompositeDisposable().add(
        getDataManager()
            .doServerGetBillersList()
            .observeOn(getSchedulerProvider().ui())
            .subscribeOn(getSchedulerProvider().io())
            .subscribe( response ->{
                for (Datum data : response.getData()) {
                    getMvpView().setUpRecyclerView(enrollmentBillers);
                    getMvpView().showDefaultViews();
                    getMvpView().hideLoading();
                }, throwable -> {
                    ...

这就是我在测试中的做法:

@Test
public void testGetListOfBillersCallsSetupRecyclerView(){
    mPresenter.retrieveListOfBillers();
    verify(mView).showLoading();
    verify(mView).setUpRecyclerView(anyList());
}

这是我实例化测试设置的方式:

@Before
public void setUp() {
    // Mockito has a very convenient way to inject mocks by using the @Mock annotation. To
    // inject the mocks in the test the initMocks method needs to be called.
    MockitoAnnotations.initMocks(this);
    CompositeDisposable compositeDisposable = new CompositeDisposable();
    mTestScheduler = new TestScheduler();
    testSchedulerProvider = new TestSchedulerProvider(mTestScheduler);
    mPresenter = new CreateBillerContactPresenter<>(
            dataManager,
            testSchedulerProvider,
            compositeDisposable
    );
    mPresenter.onAttach(mView);


when(dataManager.doServerGetBillersList()).thenReturn(Observable.just(getBillerListResponse));

我相信它与 TestScheduler 有关,但我需要一个真正知道问题所在的人,这就是为什么我的测试代码无法调用 setupRecyclerView 以及来自演示者的其他预期视图方法调用的原因?

【问题讨论】:

  • 您遇到的错误是什么?所以setUpRecyclerView没有被调用,但是showLoading被调用了?
  • 是的,这就是它返回的错误。但是我已经提供了答案,请随时验证我的答案。非常感谢您花时间阅读这个问题。 :)

标签: android mockito rx-java2 android-mvp


【解决方案1】:

我找到了答案: 似乎 TestScheduler 类有一个 triggerAction 方法,其中:

“触发尚未触发且计划在此调度程序当前时间或之前触发的任何操作。” -- 来自方法上面的 cmets。

然后presenter/datamanager按预期调用视图方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    相关资源
    最近更新 更多