我有一种方法,可以在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
答案 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();