具有后延迟的单元测试方法



我有一个在 1 秒后进行 API 调用的方法。我使用 Handler.postdelay 来实现这一点。现在,我正在尝试验证是否正在使用单元测试进行 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 秒后进行的,因此测试失败。

我尝试过的:我尝试点击此链接并使用doAnswer((,但没有成功。我想使用 thread.sleep((,这似乎是解决这个问题的一个糟糕的方法(另请阅读这是一个糟糕的方法(

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

在从表示器类调用方法之前,请尝试添加以下行

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

举个例子

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

相关内容

  • 没有找到相关文章

最新更新