我正在尝试为我们集成Bolts的安卓应用程序编写一些测试。
被测对象的工作原理是创建一个任务并在后台执行它:
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下运行它。
以下是正在测试的代码:
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?
发布于 2016-06-10 00:04:08
在单元测试中,由于您可以直接访问Task,因此请调用
task.waitForCompletion()
例如:
@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
发布于 2015-08-28 21:51:17
使用CountDownLatch使测试线程等待,直到达到您的延续
下面是在我的Robolectric测试上运行的示例代码:
@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);
}https://stackoverflow.com/questions/30991714
复制相似问题