我有一组AsyncTasks,我想在不同的订单中完成时测试行为。我可以使用通用Robolectric功能执行此操作,还是需要模拟复杂的异步处理我的后台作业?
简化我的意思是:
trigger functionality which start taskA and taskB
assert
complete taskA
assert
complete taskB
assert
trigger functionality which start taskA and taskB
assert
complete taskB
assert
complete taskA
assert
THX
答案 0 :(得分:1)
在单元测试中测试异步代码很困难。您可以考虑将AsyncTasks转换为RxJava代码。有一个名为RxAndroid的Android模块。您还可以阅读一篇解释如何Replace AsyncTask and AsyncTaskLoader with rx.Observable – RxJava Android Patterns的文章。当您阅读有关可测试性的部分时,您会注意到使用RxJava,您可以通过以下方式轻松地将非阻塞请求转换为同步阻塞请求:
List results = getWeatherForLargeUsCapitals().toBlocking().first();
assertEquals(12, results.size());
之后,您的应用程序将使用异步代码,但您的测试将是同步的,并且您将确保在请求完成时将执行断言。
答案 1 :(得分:0)
我不是异步任务的粉丝。至于我,我建议跟随Piotr回答。这将使您的应用程序更清洁,可维护和有吸引力。
如果您决定使用AsyncTask
,则应该为方法提取异步任务正文和完成正文。因此,在测试中,您可以按照您想要的任何顺序调用它们。当然,它需要使这些方法至少包装可见,这不是我想做的事情。因为更改代码以说服测试运行是邪恶的。