使用getLoaderResultSynchronously对AsyncTaskLoader进行单元测试

时间:2012-07-06 11:16:01

标签: android junit 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);
}

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

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

我试图通过几种方式解决这个问题,但似乎都没有效果:

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

有人知道为什么getLoaderResultSynchronously不会接受加载器吗?或者另一种测试Loader的干净方法,包括测试返回数据的方法?我可以在单独的案例中测试处理返回数据,但我还想测试实际数据。

此致

3 个答案:

答案 0 :(得分:6)

你看过source code了吗?您将找到以下import语句:

import android.content.Loader;
import android.content.Loader.OnLoadCompleteListener;

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

答案 1 :(得分:3)

您可以从LoaderTestCase here获取源代码,从测试项目中的源创建SupportLoaderTestCase类,并修改所有名称空间以支持库名称空间(例如,使用android.support.v4.content更改android.content.Loader。装载机)。您可以从SupportLoaderTestCase(而不是从LoaderTestCase)扩展您的测试用例并使用它而不会出现问题

答案 2 :(得分:0)

您尝试调用的方法(getLoaderResultSynchronously)接受android.content.Loader类型的对象。如果您的RESTLoader类不是那种EXACT类型,那么您将收到此错误。我怀疑你的班级直接或间接扩展了android.support.v4.content.Loader,这将解释错误。

我不知道LoaderTestCase的后端是否支持测试此类类。