android - 带延迟的单元测试方法

标签 android unit-testing junit mockito postdelayed

我有一个方法可以在 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/

相关文章:

groovy - JBehave - 所有步骤都标记为待处理?

java - java.lang.NoClassDefFoundError : Could not initialize class java test step definition class

android - 通过 Android 设备上的电话扬声器播放音频

android - 无法在 Android Studio 0.3.5 中导入模块

android - 您如何检测您的 Activity 是否由于您创建的 PendingIntent 而处于 onPaused 状态?

java - Android 如何将 Bundle 发送到另一个 Activity?

c# - 在 ServiceStack 中是否可以模拟 Request.OriginalRequest 对象进行单元测试?

c# - 使用起订量的扩展方法的单元测试

java - 用于 bean 比较的单元测试框架

java - JUnit 混淆 : use 'extends TestCase' or '@Test' ?