首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Continuations执行单元测试Bolts任务(Android)

使用Continuations执行单元测试Bolts任务(Android)
EN

Stack Overflow用户
提问于 2015-06-23 07:51:24
回答 2查看 682关注 0票数 1

我正在尝试为我们集成Bolts的安卓应用程序编写一些测试。

被测对象的工作原理是创建一个任务并在后台执行它:

代码语言:javascript
复制
Task<MyResult> currentTask;

currentTask = MyTaskFactory.getImportantTask(parameters ...);

currentTask.continueWith(new Continuation<MyResult,MyResult>() {
        @Override
        public MyResult then(Task<MyResult> task) throws Exception {
            MyResult result = task.getResult();

            if (!task.isFaulted()) {
                if (DEBUG) {
                    logger.v("got login result back: " + result.toString());
                }

                if (result.getSuccess()) {
                    callback.onMySuccess(result.getData());
                } else {
                    callback.onMyError(result.getStatusCode(), result.getError());
                }
           }

            return result;
        }
    }, Task.UI_THREAD_EXECUTOR);

MyTaskFactory.getImportantTask()返回一个任务,被测对象获取该任务并在后台执行它。当它完成时,完成应该会被执行。

我已经验证了在实际的应用程序中,此代码工作正常。我的问题出现是因为我试图在Robolectric/Mockito下运行它。

以下是正在测试的代码:

代码语言:javascript
复制
myobject.runTaskWithContinuation(parameters...);

ShadowLog.d(TAG, "Waiting....");

Task<AuthenticationResult> task = controller.getCurrentTask();

assert(task != null);

ShadowApplication.runBackgroundTasks();
ShadowLooper.runUiThreadTasksIncludingDelayedTasks();

ShadowLog.d(TAG, "Finished!");

使用这段代码,通过模拟和检测Task和code发出的调用,我已经验证了Task正在执行并生成结果,但是code从未被调用过。如果我等待任务完成,我的单元测试将永远不会完成。

我确信我在这里做错了什么,但我真的不知道是什么。我怎样才能确保在测试下调用Continuation?

EN

回答 2

Stack Overflow用户

发布于 2016-06-10 00:04:08

在单元测试中,由于您可以直接访问Task,因此请调用

task.waitForCompletion()

例如:

代码语言:javascript
复制
@Test
public void directTaskAccess() throws InterruptedException {
    Task<Boolean> task = doWorkTask();
    task.waitForCompletion();
    assertTrue(task.getResult());
}

public Task<Boolean> doWorkTask() {
    return Task.callInBackground(() -> {

        // simulate doing 'hard' work
        Thread.sleep(1000);
        return true;
    });
}

对于无法访问Task reference的其他测试,您可能需要做一些额外的工作。

这篇博客文章详细介绍了这一点:Unit Testing Asynchronous Bolts Tasks

票数 2
EN

Stack Overflow用户

发布于 2015-08-28 21:51:17

使用CountDownLatch使测试线程等待,直到达到您的延续

下面是在我的Robolectric测试上运行的示例代码:

代码语言:javascript
复制
@Test
public void test1() throws Throwable {
    success = false;
    final CountDownLatch signal = new CountDownLatch(1);
    task.onSuccess(new Continuation<Object, Object>() {
        @Override
        public Object then(Task<Object> task) throws Exception {
            if (condition == true) {
                success = true;
            }
            signal.countDown();
            return null;
        }
    });
    signal.await(30, TimeUnit.SECONDS);
    assertTrue(success);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30991714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档