后延迟的单元测试方法

时间:2019-04-25 10:00:40

标签: android unit-testing junit mockito postdelayed

我有一种方法,可以在1秒钟后进行API调用。我使用Handler.postdelayed来实现这一点。 现在,我正在尝试验证是否通过单元测试进行了API调用。

@Mock
private PlanRepository planRepository;

@Mock
private CreatePlanContract.View view;

private CreatePlanContract.Presenter presenter;
@Captor
private ArgumentCaptor<ListResponseCallback<IntersectingList>> listCaptor;
....

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
    presenter = new CreatePlanPresenter(resourceProvider, sessionContext, planRepository);
    presenter.start();
    presenter.setView(view);
    ...
}

@Test
public void testOnCameraIdleGetListEnabled(){
    presenter.onCameraIdle(true);

    verify(planRepository,times(1))
            .getList(listCaptor.capture());
}

这是我要测试的演示者中的方法:

class PlanPresenter implements PlanContract.Presenter{
    private Handler mHandler = new Handler();
    private Runnable mRunnable = this::fetchList;
    private WeakReference<CreatePlanContract.View> createPlanView;

    private ListResponseCallback<IntersectingList> listListener = new ListResponseCallback<Intersectinglist>() {
        @Override
        public void onSuccess(@NonNull List<IntersectingList> list) {
            Log.d(TAG, "callback: success resp came");
            if(createPlanView.get() != null)
                createPlanView.get().renderList(list);
        }

        @Override
        public void onError(int i, @NonNull String s, @NonNull APIResponseBody apiResponseBody, @Nullable Exception e) {
            Log.d(TAG, "callback: error resp came Auth");
        }
    };
    @Override
    public void start() {
        //some initilizations
    }

    @Override
    public void setView(@NonNull CreatePlanContract.View view) {
        this.createPlanView = new WeakReference<>(view);
    }

    @Override
    public void onCameraIdle(){
        mHandler.postDelayed(mRunnable,1000);
    }

    private void fetchList(){
        //this the method to be verified
        planRepository.getList(listListener);
    }
}

但是由于api调用是在1秒钟后进行的,因此测试失败。

我尝试过的方法: 我尝试遵循此link并使用doAnswer(),但未成功。 我想到使用thread.sleep()似乎是解决这个问题的一种糟糕方法(也读到它是一种不好的方法)

PS:我是测试的菜鸟。 我正在使用JUnit 4和Mockito

1 个答案:

答案 0 :(得分:0)

在从presenter类调用方法之前,尝试添加以下行

given(presenter.handler.postDelayed(any(Runnable.class), anyLong())).willReturn(true);

例如

given(presenter.handler.postDelayed(any(Runnable.class), anyLong())).willReturn(true);
presenter.doSomething();