Метод модульных испытаний с задержкой - PullRequest
3 голосов
/ 25 апреля 2019

У меня есть метод, который делает вызов API через 1 сек.Я использую 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());
}

Это метод в Presenter, который я хочу проверить:

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

1 Ответ

0 голосов
/ 25 апреля 2019

Попробуйте добавить следующую строку перед вызовом метода из класса докладчика

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

В качестве примера

given(presenter.handler.postDelayed(any(Runnable.class), anyLong())).willReturn(true);
presenter.doSomething();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...