5

我正在尝试为执行一些 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);
}

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

RESTLoader 扩展了 AsyncLoader。注意我用的是supportlibrary,可能里面的Loader不兼容?文档没有提供这方面的信息。

我尝试了几种方法来解决这个问题,但似乎都不起作用:

  • 向加载程序注册了一个侦听器。但是,回调永远不会触发
  • 使用 CountdownLatch(也与侦听器一起使用)。同样,没有触发/倒计时超时。
  • 玩弄类型模板(),但没有成功。
  • SO上的类似解决方案,尽管再次未能达到听众。

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

真挚地,

4

3 回答 3

6

你看过源代码吗?您会发现以下导入语句:

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

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

于 2012-07-09T22:10:34.617 回答
3

您可以在此处从 LoaderTestCase 获取源,在您的测试项目中从该源创建 SupportLoaderTestCase 类并修改所有命名空间以支持库命名空间(例如,将 android.content.Loader 更改为 android.support.v4.content.Loader)。您可以从 SupportLoaderTestCase(而不是 LoaderTestCase)扩展您的测试用例并毫无问题地使用它

于 2014-01-16T15:41:10.627 回答
0

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

我不知道支持测试此类类的 LoaderTestCase 的后向端口。

于 2012-07-09T21:48:29.693 回答