我有一个方法可以在 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
最佳答案
尝试在从演示者类调用方法之前添加以下行
given(presenter.handler.postDelayed(any(Runnable.class), anyLong())).willReturn(true);
举个例子
given(presenter.handler.postDelayed(any(Runnable.class), anyLong())).willReturn(true);
presenter.doSomething();
关于android - 带延迟的单元测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55846638/