使用getLoaderResultSynchronously对AsyncTaskLoader进行单元测试

M. *_*oom 5 junit android android-loader

我正在尝试为执行某些API调用的REST客户端创建单元测试.客户端在实时应用程序中工作正常,但我不能让它在测试用例中运行.

显然,可以在这里使用LoaderTestCase.getLoaderResultSynchronously()(至少根据Android参考,但它不会接受我的加载器.代码:

public void testGetEventInfo() {
    // Init some vars
    ...

    // Create & execute loader
    RESTLoader loader = new RESTLoader(getContext(),
            RESTLoader.HTTPVerb.GET, action, params, LOADER_GET_NEWS);
    getLoaderResultSynchronously(loader);
}
Run Code Online (Sandbox Code Playgroud)

这会产生错误,类型LoaderTestCase中的getLoaderResultSynchronously(Loader)不适用于参数(RESTLoader).

RESTLoader扩展了AsyncLoader.请注意,我正在使用supportlibrary,也许那里的Loader不兼容?文档没有提供相关信息.

我试图通过几种方式解决这个问题,但似乎没有任何方法可行:

  • 注册了一个加载器的监听器.但是,回调永远不会触发
  • 使用CountdownLatch(也有一个监听器).同样,没有触发/倒计时超时.
  • 使用类型模板(),但没有成功.
  • 关于SO的类似解决方案,虽然再次未能达到听众.

有谁知道为什么getLoaderResultSynchronously不接受加载器?或者另一种测试Loader的干净方法,包括测试返回数据的方法?我可以在单独的情况下测试处理返回数据,但我还想测试实际数据.

此致

Ale*_*ood 6

你看过源代码了吗?您将找到以下import语句:

import android.content.Loader;
import android.content.Loader.OnLoadCompleteListener;
Run Code Online (Sandbox Code Playgroud)

它看起来不像Android提供的支持版本LoaderTestCase.最简单的解决方案是暂时更改为不支持LoaderManager(即让您的类使用android.content.Loader代替),测试您的应用程序,然后切换回支持实现.您还可以考虑将测试源代码复制到项目中,导入支持LoaderManager并直接执行.我不熟悉Loaders 的测试库,但这似乎并不明显,这会导致任何重大问题.