我有一个在 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();